Асинхронное и многопоточное программирование в MQL - страница 25

 
Yuriy Asaulenko:


Начал перечитывать тему а Игорь уже об этом писал. 

Пишите dll (в которой Вы должны выделить память и зарегистрировать новый поток! - затем при выходе все аккуратно уничтожить!) и вызывайте ее из MQL

Вот об этом Юр я и пытался сказать, что надо выделять память и регистрировать поток.
Игорь пишет надо выделять и регистрировать, вы пишите не надо не чего делать.
Вот от этого и голова кругом. В итоге тупик..

Игорь учился в вышке профильно, и в этом он должен понимать побольше нас самоучек.
Я изначально склонялся к тому же, что надо выделять память и инициализировать.
Это ещё с разных курсов по Си у меня в памяти отложилось, инициализация и выделение памяти, это залог правильного кодинга, ибо что б не текло и не было мусора. 

По этому вопрос к Игорю, поясни пожалуйста  как это делать в С++?
Только не словами а на примере, словами нифига не понимается ))

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved )
{
        switch (ul_reason_for_call)
        {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
                break;
        }
        return TRUE;
}
 
Roman:

Начал перечитывать тему а Игорь уже об этом писал. 

Вот об этом Юр я и пытался сказать, что надо выделять память и регистрировать поток.

Разумеется надо, все надо.. Но DllMain здесь ни с какого боку.) - она нужна для другого. И не для вас. Забудьте о ней, лучше навсегда.) Для вас она не существует.
Пишите экспорт функции. Остальное абсолютно все тоже самое как в обычных программах. И там тоже надо.
Остальное потом, сплю уже))
 
Возьмите С#, потому что С/С++ слишком сложны для вас.
 
Roman:

Начал перечитывать тему а Игорь уже об этом писал. 

Я изначально склонялся к тому же, что надо выделять память и инициализировать.
Это ещё с разных курсов по Си у меня в памяти отложилось, инициализация и выделение памяти, это залог правильного кодинга, ибо что б не текло и не было мусора. 

По этому вопрос к Игорю, поясни пожалуйста  как это делать в С++?

Вы мастерски апаете этот топик в самый верх обсуждения, пытаясь привлечь к Вашей проблеме все более участников обсуждения )))

Не выдергивайте из контекста переписку:

- я писал это в контексте, что если Вы хотите понять как работает WinAPI, то можете использовать готовые примеры по написанию dll = более 20 статей на этом ресурсе

- я писал это в контексте, что Вы можете добраться до чистых вызовов WinAPI, путем замены подключаемых файлов, которые Вам уже написали системные программисты

....

суть переписки: начните что то читать и делать, а не писать и писать.... многое поймете, поймете, что и как работает в Windows, но это знание не будет востребовано, от Вас как от прикладного программиста требуется лишь механическая работа - выбрал тип проекта, добавил свой код, скомпилировал = получил результат - все работы за Вас выполнили сотни или тысячи системных программистов. Любая модификация шаблонов и подключаемых файлов должна иметь смысл - если не знаете, то под видом "зачем столько кода, оно и так работает!" - Вы получите не воспроизводимый баг и/или отсутствие совместимости(переносимости) с ОС/ПК

 
Vladimir Simakov:
Пост для создателей. Тролли мимо. Для  графических интерфейсов вполне так себе смотрится вынести OnChartEvent в отдельный поток.

зачем ломать ту модель которую сделали разработчики? - модель MQL-программы простая и понятная, есть события - есть точки входа обрабатывающие эти события (OnTick(),OnInit()....OnChartEvent() )

есть возможность из любой MQL-программы получить состояние торгового окружения (даже индикаторы могут посмотреть профит открытого ордера и т.п.) и можно комбинировать эксперт+скрипт, эксперт+пользовательский индикатор на одном графике - получаете асинхронное исполнение MQL-программ, эксперт торгует, индикатор выводит графическую визуализацию - если не хватает производительности потока пользовательских индикаторов (они работают в одном потоке), тогда уже конечно проблема - нужно использовать 2 эксперта на 2-х чартах и организовывать взаимодействие между чартами... 

опять же - есть конкретная задача, есть реализация, я много раз спросил, зачем эта фича нужна, ответа пока нет - только пространственные рассуждения о 3D визуализации.... причем не идет разговора где брать некий DirectX для работы с 3D            ;)

имхо, работает не трожь! )))

 
Igor Makanu:

зачем ломать ту модель которую сделали разработчики? - модель MQL-программы простая и понятная, есть события - есть точки входа обрабатывающие эти события (OnTick(),OnInit()....OnChartEvent() )

есть возможность из любой MQL-программы получить состояние торгового окружения (даже индикаторы могут посмотреть профит открытого ордера и т.п.) и можно комбинировать эксперт+скрипт, эксперт+пользовательский индикатор на одном графике - получаете асинхронное исполнение MQL-программ, эксперт торгует, индикатор выводит графическую визуализацию - если не хватает производительности потока пользовательских индикаторов (они работают в одном потоке), тогда уже конечно проблема - нужно использовать 2 эксперта на 2-х чартах и организовывать взаимодействие между чартами... 

опять же - есть конкретная задача, есть реализация, я много раз спросил, зачем эта фича нужна, ответа пока нет - только пространственные рассуждения о 3D визуализации.... причем не идет разговора где брать некий DirectX для работы с 3D            ;)

имхо, работает не трожь! )))

Смотри. Есть кнопка. Ты ее кликаешь. OnChartEvent встает в очередь. Только в этой очереди уже OnTick, а следом за ним OnTime стоит, а в них CopyRate по всем инструментам, который, на секундочку, блокирующий и цикл на хренову тучу итераций. В результате, если по кнопке, например, должно диалоговое окно развернуться, получаем подвисание интерфейса. Не критично конечно, но некрасиво.
 
Vladimir Simakov:
Смотри. Есть кнопка. Ты ее кликаешь. OnChartEvent встает в очередь. Только в этой очереди уже OnTick, а следом за ним OnTime стоит, а в них CopyRate по всем инструментам, который, на секундочку, блокирующий и цикл на хренову тучу итераций. В результате, если по кнопке, например, должно диалоговое окно развернуться, получаем подвисание интерфейса. Не критично конечно, но некрасиво.

GUI должен крутиться в главном эксперте, а все остальное в отдельном эксперте. Этот отдельный слейв эксперт помещается на невидимый OBJ_CHART и взаимодействует с главным путем EventSendCustom().

Получается что-то вроде многопоточности. У меня так реализовано.

 
Vladimir Simakov:
Смотри. Есть кнопка. Ты ее кликаешь. OnChartEvent встает в очередь. Только в этой очереди уже OnTick, а следом за ним OnTime стоит, а в них CopyRate по всем инструментам, который, на секундочку, блокирующий и цикл на хренову тучу итераций. В результате, если по кнопке, например, должно диалоговое окно развернуться, получаем подвисание интерфейса. Не критично конечно, но некрасиво.

не знаю приоритет OnChartEvent OnTick и OnTime, но разработчики писали, что если эксперт был занят и не обработал событие, то это событие не создает очередь, т.е. будет просто пропуск тика или таймера ( OnChartEvent - не знаю, не проверял )


тут логика разработчиков проста, каждое событие это конкретное действие эксперта, но именно на это событие, вот что точно знаю и проверил не однократно (в МТ5 больше в теории работаю, не знаю как физически работает ONTick):

про МТ4 однозначно скажу: все торговые операции только через приходящий тик нужно делать, иначе в 9 случаях из 10 получишь отказ от сервера на обработку торговой операции,

т.е. вот сделал интерфейс с кнопкой BUY - по задумке нажимаешь BUY- сразу отправляешь ордер, но это не будет работать напрямую, нужно команду пользователя запомнить (в идеале залочить кнопку, чтобы руками не тькал )))  и по приходу тика, в OnTick() - отправить ордер на сервер - вот так будет работать в 99% случаев, т.е. пришел тик - можно выполнить торговый запрос (а не из любого места MQL)



а если вынести еще и в асинхронный поток OnChartEvent , то получим еще в довесок взаимные блокировки исполняемого кода? - ну к примеру статистику по торговле получаю при нажатии кнопки в OnChartEvent , и такую же функцию ( последняя убыточная сделка) использую в OnTick  - тут будет что то с чем то! - имхо не разгребешь все это

 
Andrey Barinov:

GUI должен крутиться в главном эксперте, а все остальное в отдельном эксперте. Этот отдельный слейв эксперт помещается на невидимый OBJ_CHART и взаимодействует с главным путем EventSendCustom().

Получается что-то вроде многопоточности. У меня так реализовано.

Вот-вот. За неимением горничной... Костыль это называется.
 
Igor Makanu:

не знаю приоритет OnChartEvent OnTick и OnTime, но разработчики писали, что если эксперт был занят и не обработал событие, то это событие не создает очередь, т.е. будет просто пропуск тика или таймера ( OnChartEvent - не знаю, не проверял )


тут логика разработчиков проста, каждое событие это конкретное действие эксперта, но именно на это событие, вот что точно знаю и проверил не однократно (в МТ5 больше в теории работаю, не знаю как физически работает ONTick):

про МТ4 однозначно скажу: все торговые операции только через приходящий тик нужно делать, иначе в 9 случаях из 10 получишь отказ от сервера на обработку торговой операции,

т.е. вот сделал интерфейс с кнопкой BUY - по задумке нажимаешь BUY- сразу отправляешь ордер, но это не будет работать напрямую, нужно команду пользователя запомнить (в идеале залочить кнопку, чтобы руками не тькал )))  и по приходу тика, в OnTick() - отправить ордер на сервер - вот так будет работать в 99% случаев, т.е. пришел тик - можно выполнить торговый запрос (а не из любого места MQL)



а если вынести еще и в асинхронный поток OnChartEvent , то получим еще в довесок взаимные блокировки исполняемого кода? - ну к примеру статистику по торговле получаю при нажатии кнопки в OnChartEvent , и такую же функцию ( последняя убыточная сделка) использую в OnTick  - тут будет что то с чем то! - имхо не разгребешь все это

Синхронизация - это задача программиста, не умеешь, не пользуешься многопоточностью. Задача создателей дать инструмент, а там уже каждый сам себе злобный буратино. Тот же а-ля mutex самому реализовать вообще не проблема.
Причина обращения: