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

 
Vict:

Что-то мы друг друга не понимает.

Но не заморачивайтесь - не создадите вы поток через КриэйтТрэд() внутри мкл, вам нужно передать указатель на функцию (с которой поток стартанёт), но как было замечено выше - кукиш.

Сделайте свою DLL, которая сама создаст нужное количество потоков.

Если вы хотите заниматься сложными расчетами, то чистых WinAPI вызовов недостаточно.

Да, мы сделали штатными прототипы массы WinAPI вызовов, но это не означает, что все из них можно вчистую вызвать из MQL.

 
Igor Makanu:

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

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

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

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

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


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

Вот портированная функция в инклуднике, с параметрами, в чём отличие то?

HANDLE  CreateThread(PVOID thread_attributes, 
                     ulong stack_size, 
                     PVOID start_address, 
                     PVOID parameter, 
                     uint creation_flags, 
                     uint &thread_id);

А вот портированная функция, получения адреса функции

PVOID  GetProcAddress(HANDLE module,
                      uchar &proc_name[]);
 

Фактически из MQL вы не сможете полноценно вызвать CreateThread, так как недоступны физические адреса функций.

Нужно сделать свою DLL, которая обеспечит реальные обработчики.

 
MetaQuotes Software Corp.:

Фактически из MQL вы не сможете полноценно вызвать CreateThread, так как недоступны физические адреса функций.

Нужно сделать свою DLL, которая обеспечит реальные обработчики.

Жесть. Портировали в инклудник CreateThread(); и GetProcAddress();
А 
физические адреса функций не получить, в чём прикол то?  )) 
Безопасность дело то хорошее, но как видите ограничивает возможность использовать стандартный WinAPI.
Зачем тогда было портировать эти функции, и вносить в стандартную mql библиотеку?
Вводя пользователя в заблуждение, если воспользоваться ими нельзя ))
И вы предлагаете писать свою асинхронную dll, от чего я и хотел избавиться, используя стандартный WinAPI
Но видимо придётся обратно возвращаться, к написанию своей асинхронной dll.

p.s.
Вот вам и подводные камни mql, для тех кто любит отправлять всё время в гугл, там нет этой информации по определению.

 
Roman:

Жесть. Портировали в инклудник CreateThread(); и GetProcAddress();
А 
физические адреса функций не получить, в чём прикол то?  )) 
Безопасность дело то хорошее, но как видите ограничивает возможность использовать стандартный WinAPI.
Зачем тогда было портировать эти функции, и вносить в стандартную mql библиотеку?
Вводя пользователя в заблуждение, если воспользоваться ими нельзя ))
И вы предлагаете писать свою асинхронную dll, от чего я и хотел избавиться, используя стандартный WinAPI
Но видимо придётся обратно возвращаться, к написанию своей асинхронной dll.

p.s.
Вот вам и подводные камни mql, для тех кто любит отправлять всё время в гугл, там нет этой информации по определению.

Не путайте прототипы WinAPi функций и портирование фукционала.

Мы специально сделали громадную работу по предоставлению прототипов стандартных WinAPI функций, чтобы разработчикам не приходилось изобретать велосипеды. Это не библиотека, а описания.

Наличие сырых WinAPI описаний не означает, что мы обеспечиваем гарантию/возможность небезопасных вызовов.

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

 
Хм... Тогда вырисовывается другая проблема.
Как тогда из mql нормально проинициализировать подгружаемую dll, и экспортируемые функции ?

LoadLibraryW("MyDll.dll");
GetProccAddress(hMyDll, "MyFunc");
 
Roman:
Хм... Тогда вырисовывается другая проблема.
Как тогда из mql нормально проинициализировать подгружаемую dll, и экспортируемые функции ?

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

чего Вы добиваетесь? - бан за флуд?

Roman:

Но видимо придётся обратно возвращаться, к написанию своей асинхронной dll.

что мешает написать? нужны звуки фанфар? - любой кто мало мальски знаком с базовым С++ или еще проще на C# - в течении дня способен нагуглить эту информацию, написать и проверить в коде, тут нужно только "желание и усидчивый зад" - так один из админов писал, имхо, точнее выражение не подберешь



ЗЫ: не припомню случая, чтобы админ в течении часа написал бы столько ответов юзеру, что то изменилось? или звезды  сегодня вот так сошлись? )))))

 
Igor Makanu:

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

чего Вы добиваетесь? - бан за флуд?

ЗЫ: не припомню случая, чтобы админ в течении часа написал бы столько ответов юзеру, что то изменилось? или звезды  сегодня вот так сошлись? )))))

В этих статьях нет описания про инициализацию dll и функций !!!
Покажите где описана инициализация деинициализация dll библиотеки и экспортируемых функций, я буду только благодарен.
Не нужно думать что люди не читают статьи, прежде чем обратиться на форум!

Igor Makanu:

что мешает написать? нужны звуки фанфар? - любой кто мало мальски знаком с базовым С++ или еще проще на C# - в течении дня способен нагуглить эту информацию, написать и проверить в коде, тут нужно только "желание и усидчивый зад" - так один из админов писал, имхо, точнее выражение не подберешь

Не чего не мешает! Была задача использовать чистый WinAPI. Без самописных dll !
Тема создана для обсуждения проблемы многопоточного программирования в mql, у вас какой то негативный настрой сегодня, какой флуд в созданной мною же теме?
Попрошу воздержаться от подобных комментариев.

 
Roman:
Хм... Тогда вырисовывается другая проблема.
Как тогда из mql нормально проинициализировать подгружаемую dll, и экспортируемые функции ?

Не надо в mql тянуть эти функции. Там в dll создавайте процессы.

 
Dmitry Fedoseev:

Не надо в mql тянуть эти функции. Там в dll создавайте процессы.

Свою dll, инициализировать в DLL_PROCESS_ATTACH: будет достаточно для вызова из mql программы?
Думал возможно работать с WinAPI функциями без проблем, и закрытые dll нужно дополнительно инициализировать, 
LoadLibraryW("MyDll.dll");