Олег (Все сообщения пользователя)

Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Хозяйке на заметку: OnStop(), или "Зачем вы это делаете, мистер Андерсон?"
 
В первом случае глобальная OnS top = nil, поэтому описанная  OnStop является локальной по области видимости внутри OnInit.
Quik видит  OnS top = nil.
То же самое будет и с переменными...
Многопоточность в Луа
 
Разработчикам Quik:
OC: Windows7
Средство просмотра: Process Explorer v16.25
Объект Quik ver.7.11 and ver.8.0.23

При запуске Lua скрипта запускается новый поток. При остановке скрипта HANDLE потока остается висеть в системе.
При запуске того же скрипта создается новый Handle потока (старый не удаляется).
Если контекст потока по некоторым оценкам занимает 1 Мб, то с каждым перезапуском  скриптов ресурс системы уменьшается.

Это утечка ресурсов или так задумано?
Или это только у меня такое?
Многопоточность в Луа
 
Цитата
swerg написал:
На 512 инструментов выставляете заявки?
Это результаты проверки граничных условий работы функции на С/С++ без QUIK
Многопоточность в Луа
 
Цитата
swerg написал:
Windows предоставляет всем нам единственную функцию для создания потоков: CreateThread Так что в любом случае поток создаётся в итоге через неё.
Да, это так. QueueUserWorkItem в конце концов тоже вызывает функцию CreateThread для создания потоков.
Только первая функция берёт потоки из текущего рабочего пула. На моей машине-системе ограничение пула 512 потоков. Программа просто арендует их временно  у ОС.

Цитата
swerg написал:
Вы расскажите чего хотите добиться
Изучал форум по концепциям: один скрипт - много бумаг (или каналов обмена с внешней программой) или много скриптов-потоков с одной бумагой ( или одним каналом обмена с внешней программой).
Прочитал, что при увеличении скриптов происходит торможение запуска или работы скриптов. Вот и захотелось полюбопытствовать, как разработчики отдают управление скриптам-потокам LUA.
Ведь если исчерпан пул рабочих потоков, то при запросе потока для скрипта через  QueueUserWorkItem система будет ждать первого освобождения потока из рабочего пула и только потом выдаст его приложению.
У меня задержка идет после аренды 512 потоков QueueUserWorkItem. Может у кого и другой пул..
А для CreateThread  такого нет.
Многопоточность в Луа
 
Цитата
Павел Bosco написал:
вы находитесь вне Lua
Да, это так.
Но потоки для скриптов создаёт QUIK. Как? Может сказать только разработчик QUIK. Пользователям - только опытным путём.
LUA использует LUAC API, а там и вызов функции ожидания ОС. А возврат зависит от вызова. Отсюда был и вопрос.
Не хотелось бы влезать в диспетчеризацию потоков ОС. Оставим это разработчикам QUIK.


Насколько я помню, вы используете PIPE каналы с гибридным способом ожидания (OVERLAPPED +SLEEP).
Вопрос по PIPE:
1. Вы для каждой бумаги создаёте свой канал в отдельном скрипте(потоке) или для каждой бумаги создаете свой экземпляр канала в одном скрипте?
2. При обмене сообщениями можно ли пихать в PIPE несколько сообщений и на другом конце автоматически считывать ровно по одному сообщению без операций парсинга потока?
(Как FIFO). Ткните меня, если можно, в пример или функцию, используемую для этого.  
Многопоточность в Луа
 
Цитата
Цитата
s_mike@rambler.ru написал:
подтверждается моим опытом.
Спасибо Вам, что у вас есть подобный опыт.
Надеюсь, что разработчики QUIK этот подход менять не будут.
Многопоточность в Луа
 
Цитата
s_mike@rambler.ru написал:
без сторонних эффектов.
Это означает, что не используется рабочий пул потоков (например, через функцию QueueUserWorkItem) и возврат после спячки ВСЕГДА осуществляется в поток с тем же номером, который был и до спячки в потоке main().
Я правильно понял?
Многопоточность в Луа
 
Известно из доков:

Все callback функции выполняются в основном потоке QUIK.
Функция main в каждом скрипте запускается в своем потоке.



Вопрос по многопоточности в LUA:Программа QUIK создает потоки для каждого скрипта напрямую через CreateThread или берет из пула потоков, предоставляемых Windows.
Например, через QueueUserWorkItem ?


К чему это?
Запускаю несколько скриптов  заведомо больше общего количества ядер процессоров.
Внутрь скриптов вставляю различные функции ожидания или засыпания потока типа

Sleep
WaitForSingleObject
WaitForMultipleObject и т.д.

При выходе потока из спячки ОС Windows вернет управление в тот же самый поток или в любой другой свободный поток из рабочего пула потоков Windows?
Использование дескрипторов сделки и заявки вне CALLBACK функций
 
Цитата
Как можем видеть, в файле trans2quik_api.h полученном по ссылке: http://arqatech.com/upload/iblock/80a/Trans2QuikAPI_1.3_x64.zip
он есть:Код, TransactionReplyDescriptor transReplyDescriptor);

Это для х64. У меня Win7 x32, поэтому пользуюсь http://arqatech.com/upload/iblock/006/Trans2QuikAPI_1.2.rar.
А там дескриптор отсутствует. Описание функций было взято оттуда.

Возможно там правильно работают и вышеназванные функции:
long __stdcall  TRANS2QUIK_ORDER_WITHDRAW_TIME (intptr_t   nOrderDescriptor) – возвращает время снятия заявки; (в  API_Tester_DLG.exe возвращает 0 при снятии заявки вручную)
long __stdcall  TRANS2QUIK_ORDER_EXPIRY (intptr_t nOrderDescriptor) –   возвращает дату окончания срока действия заявки;(в API_Tester_DLG.exe  возвращает -1)
(в API_Tester_DLG.exe возвращает 0 также WDDate, WDTimeMicrosec).
Использование дескрипторов сделки и заявки вне CALLBACK функций
 
В руководстве пользователя функция
void __stdcall TRANS2QUIK_TRANSACTION_REPLY_CALLBACK(long nTransactionResult,  long nTransactionExtendedErrorCode, long nTransactionReplyCode, DWORD dwTransId,  insigned__int64 dOrderNum, LPSTR lpstrTransactionReplyMessage, intptr_t  transReplyDescriptor) последним параметром имеет дескриптор.

В примерах для API_Tester_DLG.exe и в прототипе функции
typedef void (__stdcall *TRANS2QUIK_TRANSACTION_REPLY_CALLBACK) (long nTransactionResult, long nTransactionExtendedErrorCode, long nTransactionReplyCode, DWORD dwTransId, double dOrderNum, LPCSTR lpcstrTransactionReplyMessage); из trans2quik_api.h параметр дескриптора отсутствует.

Как получить этот дескриптор для доступа к вызову специальных функций в теле функции обратного вызова?

Цитата

Цитата
Олег написал:
Каков формат возвращаемых значений для функций:
long __stdcall TRANS2QUIK_ORDER_EXTENDED_FLAGS (intptr_t  nOrderDescriptor) – возвращает расширенные флаги заявки;
long __stdcall TRANS2QUIK_ORDER_EXEC_TYPE (intptr_t    nOrderDescriptor) – возвращает тип исполнения заявки; «0» – значение не    задано;
Функции возвращают обычное десятичное число,  которое если преобразовать в двоичный вид, каждое число (0 или 1)  которого будет что-то означать. Из максимального long значимы только  первые 1023, остальные, если и есть, означают служебную информацию.
Так что означают конкретные флаги (0 или 1) в этом двоичном коде для обоих функций?

Цитата
Цитата
Олег написал:
long TRANS2QUIK_API __stdcall TRANS2QUIK_START_TRADES(TRANS2QUIK_TRADE_STATUS_CALLBACK pfnTradeStatusCallback);
(для этой функции в описании написано void, а в примере long)
В данном конкретном случае, никакой разницы нет.
Соответствуют ли возвращаемые значения  пункту 6.12.3 ( Константы) из руководства пользователя?
Использование дескрипторов сделки и заявки вне CALLBACK функций
 
Спасибо,
Ваш юмор про long оценил. Смешно!

Буду стараться писать подробнее.

Вопрос по МАХ был, конечно, про long, возвращаемый функциями.

Каково максимальное значения для:
long __stdcall  TRANS2QUIK_ORDER_UID (intptr_t nOrderDescriptor) –  возвращает UserID пользователя, указанный в заявке;

Каков формат возвращаемых значений для функций:
  • long __stdcall TRANS2QUIK_ORDER_EXTENDED_FLAGS (intptr_t  nOrderDescriptor) – возвращает расширенные флаги заявки;
  • long __stdcall TRANS2QUIK_ORDER_EXEC_TYPE (intptr_t   nOrderDescriptor) – возвращает тип исполнения заявки; «0» – значение не   задано;
long TRANS2QUIK_API __stdcall TRANS2QUIK_START_TRADES(TRANS2QUIK_TRADE_STATUS_CALLBACK pfnTradeStatusCallback);
(для этой функции в описании написано void, а в примере long)

 
Использование дескрипторов сделки и заявки вне CALLBACK функций
 
Обладает ли QUIK clients support информацией для ответа на поставленные выше вопросы?
Использование дескрипторов сделки и заявки вне CALLBACK функций
 
Да будет так... (это к вышесказанному).

Где можно посмотреть описание формата значений возврата этих специальных функций типа Long из САLLBACKов?

  • long __stdcall  TRANS2QUIK_ORDER_DATE (intptr_t nOrderDescriptor) –  возвращает дату заявки;
  • long __stdcall  TRANS2QUIK_ORDER_TIME (intptr_t nOrderDescriptor) –  возвращает время заявки;
  • long __stdcall  TRANS2QUIK_ORDER_ACTIVATION_TIME (intptr_t  nOrderDescriptor) – возвращает время активации заявки;
  • long __stdcall  TRANS2QUIK_ORDER_WITHDRAW_TIME (intptr_t  nOrderDescriptor) – возвращает время снятия заявки; (в API_Tester_DLG.exe возвращает 0 при снятии заявки вручную)
  • long __stdcall  TRANS2QUIK_ORDER_EXPIRY (intptr_t nOrderDescriptor) –  возвращает дату окончания срока действия заявки;(в API_Tester_DLG.exe возвращает -1)
(в API_Tester_DLG.exe возвращает 0 также WDDate, WDTimeMicrosec). Соответствующие им функции подключены  в DLL?
  • long __stdcall TRANS2QUIK_ORDER_EXTENDED_FLAGS (intptr_t  nOrderDescriptor) – возвращает расширенные флаги заявки;
  • long __stdcall TRANS2QUIK_ORDER_EXEC_TYPE (intptr_t  nOrderDescriptor) – возвращает тип исполнения заявки; «0» – значение не  задано;
Каковы максимальные значения для:
         long nExtendedErrorCode
  • long __stdcall  TRANS2QUIK_ORDER_UID (intptr_t nOrderDescriptor) –  возвращает UserID пользователя, указанный в заявке;
Я, конечно, понимаю, что Long - это 2 147 483 647. А реально MAX?

Почему нужна информация о макс. значениях.

В Амиброкере используется single Float, а это гарантированно только 6 значащих цифр.
Поэтому смотрю, что можно запихнуть в этот формат напрямую без дополнительных ухищрений.
Использование дескрипторов сделки и заявки вне CALLBACK функций
 
Это я прочитал.
Поэтому и задал вопрос о сохранении дескриптора и дальнейшем использовании.
Является ли переменная дескриптора  глобальным идентификатором или только локальным?

И какая  есть  возможность прямого вызова этих внутренних функций из DLL, перечисленных внутри CALLBACK?
(В списке экспортируемых многие из них есть).

Объясню.
На момент компиляции CALLBACK функции, я не знаю, какие специальные функции мне понадобится потом вызывать.
А вызывать все подряд, чтобы только было - ресурсозатратно.
Использование дескрипторов сделки и заявки вне CALLBACK функций
 
Через дескрипторы сделки и заявки внутри CALLBACK функций вызывается много дополнительных процедур.
Можно ли вызывать эти процедуры вне CALLBACK функции, имея только сохранённый дескриптор из CALLBACK функции.

Если Да, то как долго он действует.
Ведь у него ограничение Long.
не работает функция sleep(), на одном компе не работает функция sleep()
 
Нашёл комп с Win32. Проблемы нет.

На компе с проблемой  сделал откат системы. Всё заработало.

А код тестового скрипта был в первом сообщении.
не работает функция sleep(), на одном компе не работает функция sleep()
 
Версия 7.2.0.45

Для проверки скачивал последнюю версию Quik-Junior c этого сайта.

Попробую найти для проверки ещё комп с Win7 32 бит.

Может быть дело в этом?
не работает функция sleep(), на одном компе не работает функция sleep()
 
Простой Пример из руководства:

function main()
while true do
message(os.date()) --раз в секунду выводит текущие дату и время
sleep(1000)
end
end

На одном компе вывод идёт без всяких задержек.
Пробовал  следом за sleep(1000)  ставить message(os.date())
выводит одно и тоже время.
Пробовал увеличивать время задержки - без толку.
Везде Win7. Не работает на Win7 32 бит.

Системный Таймер Os и тик таймер процессора на этой машине работает. Проверял.

Каковы возможные причины?
Страницы: 1
Наверх