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

 
Roman:

Я не учился на программиста, всё изучаю сам, по этому не пинайте меня зануду ))

Я тоже. У меня другая профессия. Программирование только инструмент, вроде молотка.)

Создание ДЛЛ  для МКЛ - там абсолютно стандартная ДЛЛ, никаких особенностей. Остальное - чистый С++, или, если хотите, чистый C#.

Научить C++ или Шарпу просто не в моих силах, но литературы вагонами, любого уровня.

Есть статья на МКЛ о создании простенькой ДЛЛ, ничего не могу сказать о ее информативности. Да, и Гугл в помощь по запросу - С++ создание ДЛЛ.

Кстати, о точке входа и пр. В Visual Studio создается проект ДЛЛ, и все нужное именно ДЛЛ создается само, только руками не трогайте.) Ну, а функции взаимодействия, потоки и пр. - это уже только вы сами. Это С++, никаких таких особенностей связанных именно с ДЛЛ.

ЗЫ Лучший способ изучения чего либо - решение вами конкретной задачи. Это даже не мной придумано.)

 
Yuriy Asaulenko:

Я тоже. У меня другая профессия. Программирование только инструмент, вроде молотка.)

Создание ДЛЛ  для МКЛ - там абсолютно стандартная ДЛЛ, никаких особенностей. Остальное - чистый С++, или, если хотите, чистый C#.

Научить C++ или Шарпу просто не в моих силах, но литературы вагонами, любого уровня.

Есть статья на МКЛ о создании простенькой ДЛЛ, ничего не могу сказать о ее информативности. Да, и Гугл в помощь по запросу - С++ создание ДЛЛ.

Кстати, о точке входа и пр. В Visual Studio создается проект ДЛЛ, и все нужное именно ДЛЛ создается само, только руками не трогайте.) Ну, а функции взаимодействия, потоки и пр. - это уже только вы сами. Это С++, никаких таких особенностей связанных именно с ДЛЛ.

Да сами dll я писать могу, с пустой точкой входа ))
А вот инфы по точке входа не где нет, жесть просто, ни гугл не даёт, ни литературы подобной ((
У меня именно проблема с точкой входа, как вы пишите функции взаимодействия, инициализация, выделение памяти, потоки, деинициализация и пр. 
Знаю что все это в свиче реализуется в точке входа и всё, тупик ))
А что именно искать для изучения даже не знаю.

 
Roman:

Да сами dll я писать могу, с пустой точкой входа ))
А вот инфы по точке входа не где нет, жесть просто, ни гугл не даёт, ни литературы подобной ((
У меня именно проблема с точкой входа, как вы пишите функции взаимодействия, инициализация, выделение памяти, потоки, деинициализация и пр. 
Знаю что все это в свиче реализуется в точке входа и всё, тупик ))
А что именно искать для изучения даже не знаю.

Вы полагаете, что я знаю что либо о точке входа? Не царское это дело.) В ДЛЛ всего одна уникальная функция определяющая это

// dllmain.cpp: определяет точку входа для приложения DLL.
#include "stdafx.h"

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;
}

Понимать это нет никакой необходимости.) В дальнейшем, в большинстве случаев, при написании и эксплуатации ДЛЛ это использовать нет никакой необходимости. Главное, руками это не трогать.)

 
Yuriy Asaulenko:

Вы полагаете, что я знаю что либо о точке входа? Не царское это дело.) В ДЛЛ всего одна уникальная функция определяющая это

Понимать это нет никакой необходимости.) В дальнейшем, в большинстве случаев, при написании и эксплуатации ДЛЛ это использовать нет никакой необходимости. Главное, руками это не трогать.)

Да нет как раз её и нужно понимать, вы же написали сами последовательность действий, вот я и подумал что вы об этом знаете хорошо.
В этой точке входа как раз и производятся все действия, по  инициализации функций, выделении памяти, создание потока, деинициализации и т.д.
Хотя бы что почитать на эту тему?

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

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

Yuriy Asaulenko, 2019.07.27 21:25

Создаете в ДЛЛ поток и передаете ему данные, отсоединяете поток и забываете о нем - он сам завершится выполнив свою задачу.
При отсоединении потока в ДЛЛ, поток терминала освобождается. Весь процесс занимает, полагаю, меньше миллисекунды.
Сужу по тому, что даже не отсоединяя поток, процесс записи в БД составляет 4-5 мс. Ну, а 60 тиков/с достаточно, чтобы не грустить об асинхронном вызове из терминала.


 
Roman:

Да нет как раз её и нужно понимать, вы же написали сами последовательность действий, вот я и подумал что вы об этом знаете хорошо.
Хотя бы что почитать на эту тему?

Не надо ее понимать, модифицировать и пр. Создаете проект ДЛЛ в VS, DllMain() создается сама. Все приложения Windows автоматом это поддерживают.

Ваша задача, написать  экспорт функции и, кроме них, любой, какой вам нужен,  самый обычный код С++. Ваша ДЛЛ готова и будет работать.

ООП создано в первую очередь для того, чтобы применять объекты не имея представления о их внутреннем устройстве, чтобы вы могли сосредоточиться на решении именно своей задачи, а не на изучении всего и вся. Мы ездим на автомобиле, и можем не иметь представления о его электронике и устройстве двигателя. В случае с ДЛЛ все аналогично.

А функция DllMain(), которую я ранее привел, взята из реального проекта достаточно сложной ДЛЛ, которая выполняет свои задачи.

 
Yuriy Asaulenko:

Не надо ее понимать, модифицировать и пр. Создаете проект ДЛЛ в VS, DllMain() создается сама. Все приложения Windows автоматом это поддерживают.

Ваша задача, написать  экспорт функции и, кроме них, любой, какой вам нужен,  самый обычный код С++. Ваша ДЛЛ готова и будет работать.

ООП создано в первую очередь для того, чтобы применять объекты не имея представления о их внутреннем устройстве. Мы ездим на автомобиле, и можем не иметь представления о его электронике и устройстве двигателя. В случае с ДЛЛ все аналогично.

Это понятно, сами функции написать не проблема, со всеми соглашениями как в статьях 1 и 2 с этим проблем нет.
Но как я предполагаю, чтобы создать поток для вызываемой функции,
в кейсе DLL_THREAD_ATTACH нужно проделать некое шаманство функциями C++
выделить память, создать поток для этой функции,
а потом это всё почистить в DLL_THREAD_DETACH по этому тут не всё так просто как кажется.

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

 
Roman:

По этому нужно шаманить с точкой входа и выхода. 

...то есть удаление эксперта с графика, у меня падает терминал. 

Не нужно. Виновата не точка входа. Вы что-то делаете не так.

Классы, потоки, и пр., и пр. - все это прекрасно создается и работает в ДЛЛ без всякого шаманства. Но, к моменту выхода все ВАШИ процессы в ДЛЛ должны быть завершены, а объекты уничтожены. При отладке ДЛЛ такое случается.) В С/С++  весь контроль - задача программиста, а не программы.

ЗЫ Я это делаю примерно так. Вызываю из приложения функцию ДЛЛ, скажем

bool job =true;

void Close() 
{
	job = false;
	delete Obj1;
	delete Obj2;
	......
}
По job=false все процессы завершаются, по delete все объекты под кот выделялась память удаляются, и т.д.
 
Yuriy Asaulenko:

Но, к моменту выхода все ВАШИ процессы в ДЛЛ должны быть завершены.

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

 
Roman:

Но как раз DLL_PROCESS_DETACH за это и отвечает, и нужно принудительно в этом кейсе грохать все процессы.

Она отвечает за дисконнект ДЛЛ с приложением. Ответственность DllMain() - поддержка стандартного протокола взаимодействия. DLL_PROCESS_DETACH - это вообще о другом.) Ваши процессы ее никак не интересуют, это исключительно ваше дело.

В МТ есть функция завершения. OnClose(), кажется. Вот из нее все процессы и завершайте вызовом соответствующей функции ДЛЛ.

 
Yuriy Asaulenko:

Она отвечает за дисконнект ДЛЛ с приложением. Ваши процессы ее никак не интересуют, это исключительно ваше дело.

Ок буду пробовать. Благодарю что уделили своё время на пояснение тонкостей, спасибо.

Причина обращения: