Хозяйке на заметку: OnStop(), или "Зачем вы это делаете, мистер Андерсон?"
Пользователь
Сообщений: Регистрация: 03.08.2016
21.08.2019 15:30:04
В первом случае глобальная OnS top = nil, поэтому описанная OnStop является локальной по области видимости внутри OnInit. Quik видит OnS top = nil. То же самое будет и с переменными...
Многопоточность в Луа
Пользователь
Сообщений: Регистрация: 03.08.2016
22.07.2019 14:50:12
Разработчикам Quik: OC: Windows7 Средство просмотра: Process Explorer v16.25 Объект Quik ver.7.11 and ver.8.0.23
При запуске Lua скрипта запускается новый поток. При остановке скрипта HANDLE потока остается висеть в системе. При запуске того же скрипта создается новый Handle потока (старый не удаляется). Если контекст потока по некоторым оценкам занимает 1 Мб, то с каждым перезапуском скриптов ресурс системы уменьшается.
Это утечка ресурсов или так задумано? Или это только у меня такое?
Многопоточность в Луа
Пользователь
Сообщений: Регистрация: 03.08.2016
18.07.2019 11:25:55
Цитата
swerg написал: На 512 инструментов выставляете заявки?
Это результаты проверки граничных условий работы функции на С/С++ без QUIK
Многопоточность в Луа
Пользователь
Сообщений: Регистрация: 03.08.2016
15.07.2019 13:09:05
Цитата
swerg написал: Windows предоставляет всем нам единственную функцию для создания потоков: CreateThread Так что в любом случае поток создаётся в итоге через неё.
Да, это так. QueueUserWorkItem в конце концов тоже вызывает функцию CreateThread для создания потоков. Только первая функция берёт потоки из текущего рабочего пула. На моей машине-системе ограничение пула 512 потоков. Программа просто арендует их временно у ОС.
Изучал форум по концепциям: один скрипт - много бумаг (или каналов обмена с внешней программой) или много скриптов-потоков с одной бумагой ( или одним каналом обмена с внешней программой). Прочитал, что при увеличении скриптов происходит торможение запуска или работы скриптов. Вот и захотелось полюбопытствовать, как разработчики отдают управление скриптам-потокам LUA. Ведь если исчерпан пул рабочих потоков, то при запросе потока для скрипта через QueueUserWorkItem система будет ждать первого освобождения потока из рабочего пула и только потом выдаст его приложению. У меня задержка идет после аренды 512 потоков QueueUserWorkItem. Может у кого и другой пул.. А для CreateThread такого нет.
Да, это так. Но потоки для скриптов создаёт QUIK. Как? Может сказать только разработчик QUIK. Пользователям - только опытным путём. LUA использует LUAC API, а там и вызов функции ожидания ОС. А возврат зависит от вызова. Отсюда был и вопрос. Не хотелось бы влезать в диспетчеризацию потоков ОС. Оставим это разработчикам QUIK.
Насколько я помню, вы используете PIPE каналы с гибридным способом ожидания (OVERLAPPED +SLEEP). Вопрос по PIPE: 1. Вы для каждой бумаги создаёте свой канал в отдельном скрипте(потоке) или для каждой бумаги создаете свой экземпляр канала в одном скрипте? 2. При обмене сообщениями можно ли пихать в PIPE несколько сообщений и на другом конце автоматически считывать ровно по одному сообщению без операций парсинга потока? (Как FIFO). Ткните меня, если можно, в пример или функцию, используемую для этого.
Многопоточность в Луа
Пользователь
Сообщений: Регистрация: 03.08.2016
12.07.2019 11:49:14
Цитата
Цитата
написал: подтверждается моим опытом.
Спасибо Вам, что у вас есть подобный опыт. Надеюсь, что разработчики QUIK этот подход менять не будут.
Многопоточность в Луа
Пользователь
Сообщений: Регистрация: 03.08.2016
11.07.2019 17:01:34
Цитата
написал: без сторонних эффектов.
Это означает, что не используется рабочий пул потоков (например, через функцию QueueUserWorkItem) и возврат после спячки ВСЕГДА осуществляется в поток с тем же номером, который был и до спячки в потоке main(). Я правильно понял?
Многопоточность в Луа
Пользователь
Сообщений: Регистрация: 03.08.2016
11.07.2019 16:30:24
Известно из доков:
Все callback функции выполняются в основном потоке QUIK. Функция main в каждом скрипте запускается в своем потоке.
Вопрос по многопоточности в LUA:Программа QUIK создает потоки для каждого скрипта напрямую через CreateThread или берет из пула потоков, предоставляемых Windows. Например, через QueueUserWorkItem ?
К чему это? Запускаю несколько скриптов заведомо больше общего количества ядер процессоров. Внутрь скриптов вставляю различные функции ожидания или засыпания потока типа
Sleep WaitForSingleObject WaitForMultipleObject и т.д.
При выходе потока из спячки ОС Windows вернет управление в тот же самый поток или в любой другой свободный поток из рабочего пула потоков Windows?
Использование дескрипторов сделки и заявки вне CALLBACK функций
Пользователь
Сообщений: Регистрация: 03.08.2016
08.06.2017 19:09:02
Цитата
Как можем видеть, в файле trans2quik_api.h полученном по ссылке: он есть:Код, TransactionReplyDescriptor transReplyDescriptor);
Это для х64. У меня Win7 x32, поэтому пользуюсь . А там дескриптор отсутствует. Описание функций было взято оттуда.
Возможно там правильно работают и вышеназванные функции: 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 функций
Пользователь
Сообщений: Регистрация: 03.08.2016
02.06.2017 11:28:27
В руководстве пользователя функция 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 функций
Пользователь
Сообщений: Регистрация: 03.08.2016
31.05.2017 14:05:18
Спасибо, Ваш юмор про 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 функций
Пользователь
Сообщений: Регистрация: 03.08.2016
29.05.2017 18:58:18
Обладает ли QUIK clients support информацией для ответа на поставленные выше вопросы?
Использование дескрипторов сделки и заявки вне CALLBACK функций
Пользователь
Сообщений: Регистрация: 03.08.2016
26.05.2017 15:06:37
Да будет так... (это к вышесказанному).
Где можно посмотреть описание формата значений возврата этих специальных функций типа 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 функций
Пользователь
Сообщений: Регистрация: 03.08.2016
26.05.2017 12:09:55
Это я прочитал. Поэтому и задал вопрос о сохранении дескриптора и дальнейшем использовании. Является ли переменная дескриптора глобальным идентификатором или только локальным?
И какая есть возможность прямого вызова этих внутренних функций из DLL, перечисленных внутри CALLBACK? (В списке экспортируемых многие из них есть).
Объясню. На момент компиляции CALLBACK функции, я не знаю, какие специальные функции мне понадобится потом вызывать. А вызывать все подряд, чтобы только было - ресурсозатратно.
Использование дескрипторов сделки и заявки вне CALLBACK функций
Пользователь
Сообщений: Регистрация: 03.08.2016
26.05.2017 11:24:10
Через дескрипторы сделки и заявки внутри CALLBACK функций вызывается много дополнительных процедур. Можно ли вызывать эти процедуры вне CALLBACK функции, имея только сохранённый дескриптор из CALLBACK функции.
Если Да, то как долго он действует. Ведь у него ограничение Long.
не работает функция sleep(), на одном компе не работает функция sleep()
Пользователь
Сообщений: Регистрация: 03.08.2016
04.08.2016 13:39:37
Нашёл комп с Win32. Проблемы нет.
На компе с проблемой сделал откат системы. Всё заработало.
А код тестового скрипта был в первом сообщении.
не работает функция sleep(), на одном компе не работает функция sleep()
Пользователь
Сообщений: Регистрация: 03.08.2016
04.08.2016 12:30:43
Версия 7.2.0.45
Для проверки скачивал последнюю версию Quik-Junior c этого сайта.
Попробую найти для проверки ещё комп с Win7 32 бит.
Может быть дело в этом?
не работает функция sleep(), на одном компе не работает функция sleep()
Пользователь
Сообщений: Регистрация: 03.08.2016
03.08.2016 20:00:14
Простой Пример из руководства:
function main() while true do message(os.date()) --раз в секунду выводит текущие дату и время sleep(1000) end end
На одном компе вывод идёт без всяких задержек. Пробовал следом за sleep(1000) ставить message(os.date()) выводит одно и тоже время. Пробовал увеличивать время задержки - без толку. Везде Win7. Не работает на Win7 32 бит.
Системный Таймер Os и тик таймер процессора на этой машине работает. Проверял.