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

 
Koldun Zloy:

Перевожу, то что Вам уже ответил представитель компании разработчиков МТ:

Создавать потоки из MQL нельзя. Даже при помощи WinAPI.

Вы можете это сделать, только написав свою DLL.

WinAPI и использует стандартные dll !

kernel32.dll
user32.dll

и т.д.

Предполагалась многопоточная работа с функциями WinAPI, а не с функциями mql
Но то, что нельзя многопоточно работать с mql функциями, да, печально.

 
Roman:

WinAPI и использует стандартные dll !

kernel32.dll
user32.dll

хм, по моему с точностью до наоборот:  WinAPI реализовано в виде динамических библиотек kernel32.dll , user32.dll...

по моему Вы ни разу не пробовали написать на чистом С++ обычное Windows окно с текстом "Hello Word!" - примеров в сети "вагон с тележкой", напишете свое первое "Hello Word!" - многое само собой прояснится ;)

 
Igor Makanu:

хм, по моему с точностью до наоборот:  WinAPI реализовано в виде динамических библиотек kernel32.dll , user32.dll...

по моему Вы ни разу не пробовали написать на чистом С++ обычное Windows окно с текстом "Hello Word!" - примеров в сети "вагон с тележкой", напишете свое первое "Hello Word!" - многое само собой прояснится ;)


Стандартные имелось ввиду, что это стандартные Windows dll, стандартные не означает что они статические .lib

Игорь, вы что то не в ту степь...
Причём тут "Hello Word!"  когда вопрос про инициализацию dll, и вызов из неё функции в своём потоке !

Для примера:
Есть WinAPI функция MessageBoxW();
Её нужно вызвать в своём потоке.

Для это необходимо проинициализировать саму dll и экспортируемую функцию, приведите пример как это правильно сделать?

LoadLibraryW("user32.dll");
GetProccAddress(hMyDll, "MessageBoxW");
FreeLibrary(hMyDll);
и т.д.

Затем после инициализации, вызываем MessageBoxW(); с помощью CreateThread();
После выполнения функции, освобождаем ресурс и закрываем поток.
Приведите пример как это сделать правильно в mql ?

 
Сейчас как раз занимаюсь многопоточной системой. Но не на МКЛ, а на стандартном С++. Ах, сколько там граблей пораскидано.))
 
Roman:


Стандартные имелось ввиду, что это стандартные Windows dll, стандартные не означает что они статические .lib

Игорь, вы что то не в ту степь...
Причём тут "Hello Word!"  когда вопрос про инициализацию dll, и вызов из неё функции в своём потоке !

Для примера:
Есть WinAPI функция MessageBoxW();
Её нужно вызвать в своём потоке.

Для это необходимо проинициализировать саму dll и экспортируемую функцию, приведите пример как это правильно сделать?

Затем после инициализации, вызываем MessageBoxW(); с помощью CreateThread();
После выполнения функции, освобождаем ресурс и закрываем поток.
Приведите пример как это сделать правильно в mql ?

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

где в Вашем примере выделение памяти и регистрация процесса ? то, что Вы вызвали MessageBox - это означает, лишь, что MQL программа предоставила свои ресурсы, но не создала отдельный поток, даже проверять не хочу, но при вызове MessageBox, у Вас должен подвиснуть терминал

 
Igor Makanu:

это Вы не в ту степь, Вам же ответили - пишите dll и вызывайте ее из MQL

где в Вашем примере выделение памяти и регистрация процесса ? то, что Вы вызвали MessageBox - это означает, лишь, что MQL программа предоставила свои ресурсы, но не создала отдельный поток, даже проверять не хочу, но при вызове MessageBox, у Вас должен подвиснуть терминал

Игорь, функции по инициализации dll я привёл для примера, чтоб понимали о чём речь, но как это правильно делать на mql, я не в в курсе, чистый C++ может ввести в заблуждение.
Да и сама особенность языка mql может запудрить мозги. По этому и обратился за помощью на форум, а не в гугл. 
Да зачем мне писать dll, когда WinAPI и так построен на dll, и вызываемые функции уже находятся к примеру в   user32.dll
Так я и создал тему, чтобы разобраться в этом вопросе как это правильно делать в mql, а вы мне где выделение памяти и регистрация процесса )).
Покажите правильный пример как это делается в mql?
Или направьте на хороший гайд.

 
Roman:

Игорь, функции по инициализации dll я привёл для примера, чтоб понимали о чём речь, но как это правильно делать на mql, я не в в курсе, чистый C++ может ввести в заблуждение.
Да и сама особенность языка mql может запудрить мозги. По этому и обратился за помощью на форум, а не в гугл. 
Да зачем мне писать dll, когда WinAPI и так построен на dll, и вызываемые функции уже находятся к примеру в   user32.dll
Так я и создал тему, чтобы разобраться в этом вопросе как это правильно делать в mql, а вы мне где выделение памяти и регистрация процесса )).
Покажите правильный пример как это делается в mql?
Или направьте на хороший гайд.

Не создадите поток из программы mql, даже используя WinAPI.

 
Roman:

Игорь, функции по инициализации dll я привёл для примера, чтоб понимали о чём речь, но как это правильно делать на mql, я не в в курсе, чистый C++ может ввести в заблуждение.
Да и сама особенность языка mql может запудрить мозги. По этому и обратился за помощью на форум, а не в гугл. 
Да зачем мне писать dll, когда WinAPI и так построен на dll, и вызываемые функции уже находятся к примеру в   user32.dll
Так я и создал тему, чтобы разобраться в этом вопросе как это правильно делать в mql, а вы мне где выделение памяти и регистрация процесса )).
Покажите правильный пример как это делается в mql?
Или направьте на хороший гайд.

еще раз - это не делается средствами MQL , Вы решаете задачу с другой стороны - со стороны хвоста. а не с головы!

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

как написать dll - поиском по форуму "dll" статей 20 будет точно

гайдов нет, но на чем Вы будете писать dll - на том ресурсе и ищите решения как создавать потоки и пр.

 
Dmitry Fedoseev:

Не создадите поток из программы mql, даже используя WinAPI.

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

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

MetaQuotes Software Corp., 2019.07.24 16:31

Из DLL нельзя вызывать MQL функции.

Но можно запускать множественные потоки через вызовы DLL, чтобы они независимо от MQL5 работали в своем окружении.

Например, из MQL подготовили данные, разместили где-то или передали в DLL библиотеку, которая уже в свою очередь во множестве потоков отработает задачу и вернет результат через дополнительную функцию.


Вызов Windows API функций, и является вызовом из dll, значит для Windows API функций можно создавать потоки с помощью CreateThread();
Не зря же 
CreateThread(); портировали в стандартную mql библиотеку.

 
Roman:

Вызов Windows API функций, и является вызовом из dll, значит для Windows API функций можно создавать потоки с помощью CreateThread();
Не зря же 
CreateThread(); портировали в стандартную mql библиотеку.

никто ничего не портировал, то что Вы видите в инклуднике это лишь сигнатуры функций 

чтобы создать поток нужно тело функции - вот то тело которое будет крутиться в потоке!

чтобы зарегистрировать поток в Виндовс нужно заполнить структуру:

HANDLE CreateThread(
  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  SIZE_T                  dwStackSize,
  LPTHREAD_START_ROUTINE  lpStartAddress,
  __drv_aliasesMem LPVOID lpParameter,
  DWORD                   dwCreationFlags,
  LPDWORD                 lpThreadId
);

видите lpStartAddress - вот это и есть адрес точки входа в функцию которая будет работать в потоке, про выделение памяти промолчим

чтобы решить это задачу, Вам нужно найти возможность получить средствами MQL адрес MyFunc() - в памяти, а его нет - нет от слова нигде, ну совсем... нет!


не знаю как еще доходчивее "на пальцах" объяснить проблему... которой нет по сути )))