MQL中的异步和多线程编程 - 页 24

 
Roman:

我不是为了成为一个程序员而学习的,我在自己学习一切,所以不要把我踢到路边去 ))

我也没有。我有一个不同的职业。编程只是一种工具,就像一把锤子)。

为MKL创建DLL--有绝对标准的DLL,没有特殊功能。剩下的就是纯C++,或者纯C#,如果你喜欢的话。

教C++或夏普只是超越了我,但有马车的文学,在任何水平。

MKL上有一篇关于创建一个简单的DLL的文章,不能说它有什么信息量。是的,还有谷歌来帮助查询--C++ DLL的创建。

顺便说一下,说到进入点等等。在Visual Studio 中,你创建一个DLL项目,你所需要的一切都由你自己创建,只是不要用手去碰它)。而互动功能、线程等则由你决定。- 是由你决定的。这是C++,没有专门与DLL相关的此类功能。

SZY 学习任何东西的最好方法是让你解决一个具体的任务。它甚至不是由我发明的)。

 
Yuriy Asaulenko:

我也不知道。我有一个不同的职业。编程只是一种工具,就像一把锤子)。

为MKL创建dlls - 那里绝对是标准的dlls,没有特殊功能。剩下的就是纯C++,或者纯C#,如果你喜欢的话。

教C++或夏普只是超越了我,但有马车的文学,在任何水平。

MKL上有一篇关于创建一个简单的DLL的文章,不能说它有什么信息量。是的,还有谷歌来帮助查询--C++ DLL的创建。

顺便说一下,说到进入点等等。在Visual Studio中,一个DLL项目被创建,你所需要的一切都被自己创建,只是不要用手去碰它)。好吧,虽然互动功能、线程等由你决定。- 是由你决定的。这是C++;没有专门与DLL相关的此类功能。

是的,我可以自己写dll,有一个空的入口点))
但是,进入点的信息不知道在哪里,只是尖锐的,没有谷歌给的,没有类似的文献()。
我正好有一个关于入口点的问题,就像你写的交互函数、初始化、内存分配、线程、去初始化等等。
我知道,所有这些都是在入口处的开关中实现的,就是这样,一个死锁))。
我甚至不知道该找什么来研究。

 
Roman:

是的,我可以自己写dll,有一个空的入口点 ))
但关于入境点的信息无处可寻,只是地狱,既没有谷歌,也没有类似的文献(()。
我正好有一个关于入口点的问题,就像你写的交互函数、初始化、内存分配、线程、去初始化等等。
我知道,所有这些都是在入口处的开关中实现的,就是这样,一个死锁))。
我甚至不知道该找什么来研究。

你认为我是否知道任何关于入口的信息?这不是国王的事)。在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;
}

没有必要去了解它)。今后,在大多数情况下,在编写和操作DLL时,没有必要使用这个。最主要的是不要用手触摸它)。

 
Yuriy Asaulenko:

你认为我是否知道任何关于入口的信息?这不是国王的事)。在DLL中只有一个独特的函数来定义它

没有必要去了解它)。今后,在大多数情况下,在编写和操作DLL时,没有必要使用这个。最主要的是不要用手触摸它)。

不,你需要了解它,你已经写了你自己的行动序列,所以我以为你很了解它。
在这个输入点,所有的动作、函数初始化、内存分配、线程创建、非初始化等都被执行。
至少在这个主题上要读什么?

关于交易、自动交易系统和交易策略测试的论坛

MQL中的异步和多线程编程

Yuriy Asaulenko, 2019.07.27 21:25

你在DLL中创建一个线程并将数据传给它,断开线程并忘记它--它将在完成任务后自行终止。
当你断开DLL中的线程时,终端线程被释放。我相信,整个过程只需要不到一毫秒。
从以下事实来看,即使不断开线程,向数据库写入的过程也是4-5ms。好吧,60 ticks/s足以让人不为终端的异步调用而难过。


 
Roman:

不,你需要了解它,你自己写了这个序列,所以我想你应该很了解它。
至少在这个问题上要读些什么?

不需要了解它,修改它,等等。 在VS中创建一个 DLL项目,DllMain()是自己创建的。所有的Windows应用程序都自动支持它。

你的任务是编写导出函数,除了它们之外,还有任何你需要的C++代码。你的DLL已经准备好了,可以工作了。

OOP的设计主要是为了应用对象而不需要对其内部工作有任何了解,这样你就可以专注于准确地解决你的任务,而不是学习一切和任何东西。我们驾驶一辆汽车,我们可能对它的电子和发动机结构一无所知。在DLL的情况下也是如此。

而我前面引用的DllMain()函数是取自一个相当复杂的DLL的真实项目,它执行的任务。

 
Yuriy Asaulenko:

不需要了解它,修改它,等等。你在VS中创建一个DLL项目,DllMain()是自己创建的。所有的Windows应用程序都自动支持它。

你的任务是编写导出函数,以及除此之外的任何你需要的C++代码。你的DLL已经准备好了,可以工作了。

OOP的设计主要是为了应用对象,而不需要对其内部工作原理有任何了解。我们驾驶一辆汽车,我们可能对它的电子和发动机结构一无所知。在DLL的情况下,这也是一样的。

这是可以理解的,职能本身不是问题,有了第1条和第2条中的所有惯例,这就没有问题了。
但正如我所假设的那样,要为被调用的函数 创建一个线程。
在DLL_THREAD_ATTACH的情况下,我们需要做一些C++方面的处理
分配内存,为该函数创建一个线程。
然后在DLL_THREAD_DETACH中把它全部清理掉,所以它不像看起来那么容易。

为什么我这么说,因为我试过一个异步库,其中的任务是异步执行的。
我想用这个库做一个dll,但由于某些原因,它总是在程序结束时崩溃,即从图表中删除专家顾问。
由于这个原因,有必要对进入和退出点进行摆弄。

 
Roman:

这就是为什么你必须摆弄一下进入和退出点。

...即从图表中删除EA,我的终端崩溃了。

你不必如此。这不是入口处的问题。你做错了什么。

班级、线程等,等等。- 所有这些都是完美创建的,并且在DLL中运行良好,没有任何萨满主义。但是,当你退出时,DLL中的所有YOUR进程必须被终止,对象被销毁。当调试DLL时,会出现这种情况)。在C/C++中,所有的控制是程序员的任务,而不是程序。

ZS我是这样做的。我从一个应用程序中调用一个DLL函数,例如

bool job =true;

void Close() 
{
	 job = false;
	 delete Obj1;
	 delete Obj2;
	......
}
通过job=false,所有进程被终止,通过delete,所有被分配内存的对象被删除,等等。
 
Yuriy Asaulenko:

但是,当你离开时,你在DLL中的所有进程都必须完成。

这可能是问题所在,我不知道,我以为dll在解除连接时完成了自己的进程。
我会考虑如何在退出前终止所有进程,谢谢你的提示。
但只是DLL_PROCESS_DETACH负责,在这种情况下,我们需要强行杀死所有进程

 
Roman:

这正是DLL_PROCESS_DETACH的职责所在,在这种情况下,所有进程都必须被强行杀死

它负责DLL与应用程序的解连接。DllMain()负责维护标准的通信协议。DLL_PROCESS_DETACH是关于其他事情的。) 你的进程对它不感兴趣,这完全是你的事情。

在MT中,有一个关机功能。我认为是OnClose()。在这里,从它那里,所有的进程和通过调用适当的函数DLL终止。

 
Yuriy Asaulenko:

它负责断开DLL与应用程序的连接。它对你的过程不感兴趣,完全由你决定。

好吧,我去试试。谢谢你花时间解释这些细微的问题,谢谢你。