MQL中的异步和多线程编程 - 页 24 1...171819202122232425262728293031...40 新评论 Yuriy Asaulenko 2019.07.27 20:59 #231 Roman:我不是为了成为一个程序员而学习的,我在自己学习一切,所以不要把我踢到路边去 )) 我也没有。我有一个不同的职业。编程只是一种工具,就像一把锤子)。 为MKL创建DLL--有绝对标准的DLL,没有特殊功能。剩下的就是纯C++,或者纯C#,如果你喜欢的话。 教C++或夏普只是超越了我,但有马车的文学,在任何水平。 MKL上有一篇关于创建一个简单的DLL的文章,不能说它有什么信息量。是的,还有谷歌来帮助查询--C++ DLL的创建。 顺便说一下,说到进入点等等。在Visual Studio 中,你创建一个DLL项目,你所需要的一切都由你自己创建,只是不要用手去碰它)。而互动功能、线程等则由你决定。- 是由你决定的。这是C++,没有专门与DLL相关的此类功能。 SZY 学习任何东西的最好方法是让你解决一个具体的任务。它甚至不是由我发明的)。 Roman 2019.07.27 21:12 #232 Yuriy Asaulenko: 我也不知道。我有一个不同的职业。编程只是一种工具,就像一把锤子)。 为MKL创建dlls - 那里绝对是标准的dlls,没有特殊功能。剩下的就是纯C++,或者纯C#,如果你喜欢的话。 教C++或夏普只是超越了我,但有马车的文学,在任何水平。 MKL上有一篇关于创建一个简单的DLL的文章,不能说它有什么信息量。是的,还有谷歌来帮助查询--C++ DLL的创建。 顺便说一下,说到进入点等等。在Visual Studio中,一个DLL项目被创建,你所需要的一切都被自己创建,只是不要用手去碰它)。好吧,虽然互动功能、线程等由你决定。- 是由你决定的。这是C++;没有专门与DLL相关的此类功能。 是的,我可以自己写dll,有一个空的入口点)) 但是,进入点的信息不知道在哪里,只是尖锐的,没有谷歌给的,没有类似的文献()。 我正好有一个关于入口点的问题,就像你写的交互函数、初始化、内存分配、线程、去初始化等等。 我知道,所有这些都是在入口处的开关中实现的,就是这样,一个死锁))。 我甚至不知道该找什么来研究。 Yuriy Asaulenko 2019.07.27 21:18 #233 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时,没有必要使用这个。最主要的是不要用手触摸它)。 Roman 2019.07.27 21:30 #234 Yuriy Asaulenko: 你认为我是否知道任何关于入口的信息?这不是国王的事)。在DLL中只有一个独特的函数来定义它 没有必要去了解它)。今后,在大多数情况下,在编写和操作DLL时,没有必要使用这个。最主要的是不要用手触摸它)。 不,你需要了解它,你已经写了你自己的行动序列,所以我以为你很了解它。 在这个输入点,所有的动作、函数初始化、内存分配、线程创建、非初始化等都被执行。 至少在这个主题上要读什么? 关于交易、自动交易系统和交易策略测试的论坛 MQL中的异步和多线程编程 Yuriy Asaulenko, 2019.07.27 21:25 你在DLL中创建一个线程并将数据传给它,断开线程并忘记它--它将在完成任务后自行终止。 当你断开DLL中的线程时,终端线程被释放。我相信,整个过程只需要不到一毫秒。 从以下事实来看,即使不断开线程,向数据库写入的过程也是4-5ms。好吧,60 ticks/s足以让人不为终端的异步调用而难过。 Yuriy Asaulenko 2019.07.27 21:48 #235 Roman:不,你需要了解它,你自己写了这个序列,所以我想你应该很了解它。 至少在这个问题上要读些什么? 不需要了解它,修改它,等等。你 在VS中创建一个 DLL项目,DllMain()是自己创建的。所有的Windows应用程序都自动支持它。 你的任务是编写导出函数,除了它们之外,还有任何你需要的C++代码。你的DLL已经准备好了,可以工作了。 OOP的设计主要是为了应用对象而不需要对其内部工作有任何了解,这样你就可以专注于准确地解决你的任务,而不是学习一切和任何东西。我们驾驶一辆汽车,我们可能对它的电子和发动机结构一无所知。在DLL的情况下也是如此。 而我前面引用的DllMain()函数是取自一个相当复杂的DLL的真实项目,它执行的任务。 Roman 2019.07.27 22:00 #236 Yuriy Asaulenko: 不需要了解它,修改它,等等。你在VS中创建一个DLL项目,DllMain()是自己创建的。所有的Windows应用程序都自动支持它。 你的任务是编写导出函数,以及除此之外的任何你需要的C++代码。你的DLL已经准备好了,可以工作了。 OOP的设计主要是为了应用对象,而不需要对其内部工作原理有任何了解。我们驾驶一辆汽车,我们可能对它的电子和发动机结构一无所知。在DLL的情况下,这也是一样的。 这是可以理解的,职能本身不是问题,有了第1条和第2条中的所有惯例,这就没有问题了。 但正如我所假设的那样,要为被调用的函数 创建一个线程。 在DLL_THREAD_ATTACH的情况下,我们需要做一些C++方面的处理 分配内存,为该函数创建一个线程。 然后在DLL_THREAD_DETACH中把它全部清理掉,所以它不像看起来那么容易。 为什么我这么说,因为我试过一个异步库,其中的任务是异步执行的。 我想用这个库做一个dll,但由于某些原因,它总是在程序结束时崩溃,即从图表中删除专家顾问。 由于这个原因,有必要对进入和退出点进行摆弄。 Yuriy Asaulenko 2019.07.27 22:12 #237 Roman: 这就是为什么你必须摆弄一下进入和退出点。 ...即从图表中删除EA,我的终端崩溃了。 你不必如此。这不是入口处的问题。你做错了什么。 班级、线程等,等等。- 所有这些都是完美创建的,并且在DLL中运行良好,没有任何萨满主义。但是,当你退出时,DLL中的所有YOUR进程必须被终止,对象被销毁。当调试DLL时,会出现这种情况)。在C/C++中,所有的控制是程序员的任务,而不是程序。 ZS我是这样做的。我从一个应用程序中调用一个DLL函数,例如 bool job =true; void Close() { job = false; delete Obj1; delete Obj2; ...... } 通过job=false,所有进程被终止,通过delete,所有被分配内存的对象被删除,等等。 Roman 2019.07.27 22:28 #238 Yuriy Asaulenko: 但是,当你离开时,你在DLL中的所有进程都必须完成。 这可能是问题所在,我不知道,我以为dll在解除连接时完成了自己的进程。 我会考虑如何在退出前终止所有进程,谢谢你的提示。 但只是DLL_PROCESS_DETACH负责,在这种情况下,我们需要强行杀死所有进程。 Yuriy Asaulenko 2019.07.27 22:37 #239 Roman: 但这正是DLL_PROCESS_DETACH的职责所在,在这种情况下,所有进程都必须被强行杀死。 它负责DLL与应用程序的解连接。DllMain()负责维护标准的通信协议。DLL_PROCESS_DETACH是关于其他事情的。) 你的进程对它不感兴趣,这完全是你的事情。 在MT中,有一个关机功能。我认为是OnClose()。在这里,从它那里,所有的进程和通过调用适当的函数DLL终止。 Roman 2019.07.27 22:42 #240 Yuriy Asaulenko: 它负责断开DLL与应用程序的连接。它对你的过程不感兴趣,完全由你决定。 好吧,我去试试。谢谢你花时间解释这些细微的问题,谢谢你。 1...171819202122232425262728293031...40 新评论 您错过了交易机会: 免费交易应用程序 8,000+信号可供复制 探索金融市场的经济新闻 注册 登录 拉丁字符(不带空格) 密码将被发送至该邮箱 发生错误 使用 Google 登录 您同意网站政策和使用条款 如果您没有帐号,请注册 可以使用cookies登录MQL5.com网站。 请在您的浏览器中启用必要的设置,否则您将无法登录。 忘记您的登录名/密码? 使用 Google 登录
我不是为了成为一个程序员而学习的,我在自己学习一切,所以不要把我踢到路边去 ))
我也没有。我有一个不同的职业。编程只是一种工具,就像一把锤子)。
为MKL创建DLL--有绝对标准的DLL,没有特殊功能。剩下的就是纯C++,或者纯C#,如果你喜欢的话。
教C++或夏普只是超越了我,但有马车的文学,在任何水平。
MKL上有一篇关于创建一个简单的DLL的文章,不能说它有什么信息量。是的,还有谷歌来帮助查询--C++ DLL的创建。
顺便说一下,说到进入点等等。在Visual Studio 中,你创建一个DLL项目,你所需要的一切都由你自己创建,只是不要用手去碰它)。而互动功能、线程等则由你决定。- 是由你决定的。这是C++,没有专门与DLL相关的此类功能。
SZY 学习任何东西的最好方法是让你解决一个具体的任务。它甚至不是由我发明的)。
我也不知道。我有一个不同的职业。编程只是一种工具,就像一把锤子)。
为MKL创建dlls - 那里绝对是标准的dlls,没有特殊功能。剩下的就是纯C++,或者纯C#,如果你喜欢的话。
教C++或夏普只是超越了我,但有马车的文学,在任何水平。
MKL上有一篇关于创建一个简单的DLL的文章,不能说它有什么信息量。是的,还有谷歌来帮助查询--C++ DLL的创建。
顺便说一下,说到进入点等等。在Visual Studio中,一个DLL项目被创建,你所需要的一切都被自己创建,只是不要用手去碰它)。好吧,虽然互动功能、线程等由你决定。- 是由你决定的。这是C++;没有专门与DLL相关的此类功能。
是的,我可以自己写dll,有一个空的入口点))
但是,进入点的信息不知道在哪里,只是尖锐的,没有谷歌给的,没有类似的文献()。
我正好有一个关于入口点的问题,就像你写的交互函数、初始化、内存分配、线程、去初始化等等。
我知道,所有这些都是在入口处的开关中实现的,就是这样,一个死锁))。
我甚至不知道该找什么来研究。
是的,我可以自己写dll,有一个空的入口点 ))
但关于入境点的信息无处可寻,只是地狱,既没有谷歌,也没有类似的文献(()。
我正好有一个关于入口点的问题,就像你写的交互函数、初始化、内存分配、线程、去初始化等等。
我知道,所有这些都是在入口处的开关中实现的,就是这样,一个死锁))。
我甚至不知道该找什么来研究。
你认为我是否知道任何关于入口的信息?这不是国王的事)。在DLL中只有一个独特的函数来定义它
没有必要去了解它)。今后,在大多数情况下,在编写和操作DLL时,没有必要使用这个。最主要的是不要用手触摸它)。
你认为我是否知道任何关于入口的信息?这不是国王的事)。在DLL中只有一个独特的函数来定义它
没有必要去了解它)。今后,在大多数情况下,在编写和操作DLL时,没有必要使用这个。最主要的是不要用手触摸它)。
不,你需要了解它,你已经写了你自己的行动序列,所以我以为你很了解它。
在这个输入点,所有的动作、函数初始化、内存分配、线程创建、非初始化等都被执行。
至少在这个主题上要读什么?
关于交易、自动交易系统和交易策略测试的论坛
MQL中的异步和多线程编程
Yuriy Asaulenko, 2019.07.27 21:25
你在DLL中创建一个线程并将数据传给它,断开线程并忘记它--它将在完成任务后自行终止。
当你断开DLL中的线程时,终端线程被释放。我相信,整个过程只需要不到一毫秒。
从以下事实来看,即使不断开线程,向数据库写入的过程也是4-5ms。好吧,60 ticks/s足以让人不为终端的异步调用而难过。
不,你需要了解它,你自己写了这个序列,所以我想你应该很了解它。
至少在这个问题上要读些什么?
不需要了解它,修改它,等等。你 在VS中创建一个 DLL项目,DllMain()是自己创建的。所有的Windows应用程序都自动支持它。
你的任务是编写导出函数,除了它们之外,还有任何你需要的C++代码。你的DLL已经准备好了,可以工作了。
OOP的设计主要是为了应用对象而不需要对其内部工作有任何了解,这样你就可以专注于准确地解决你的任务,而不是学习一切和任何东西。我们驾驶一辆汽车,我们可能对它的电子和发动机结构一无所知。在DLL的情况下也是如此。
而我前面引用的DllMain()函数是取自一个相当复杂的DLL的真实项目,它执行的任务。
不需要了解它,修改它,等等。你在VS中创建一个DLL项目,DllMain()是自己创建的。所有的Windows应用程序都自动支持它。
你的任务是编写导出函数,以及除此之外的任何你需要的C++代码。你的DLL已经准备好了,可以工作了。
OOP的设计主要是为了应用对象,而不需要对其内部工作原理有任何了解。我们驾驶一辆汽车,我们可能对它的电子和发动机结构一无所知。在DLL的情况下,这也是一样的。
这是可以理解的,职能本身不是问题,有了第1条和第2条中的所有惯例,这就没有问题了。
但正如我所假设的那样,要为被调用的函数 创建一个线程。
在DLL_THREAD_ATTACH的情况下,我们需要做一些C++方面的处理
分配内存,为该函数创建一个线程。
然后在DLL_THREAD_DETACH中把它全部清理掉,所以它不像看起来那么容易。
为什么我这么说,因为我试过一个异步库,其中的任务是异步执行的。
我想用这个库做一个dll,但由于某些原因,它总是在程序结束时崩溃,即从图表中删除专家顾问。
由于这个原因,有必要对进入和退出点进行摆弄。
这就是为什么你必须摆弄一下进入和退出点。
...即从图表中删除EA,我的终端崩溃了。
你不必如此。这不是入口处的问题。你做错了什么。
班级、线程等,等等。- 所有这些都是完美创建的,并且在DLL中运行良好,没有任何萨满主义。但是,当你退出时,DLL中的所有YOUR进程必须被终止,对象被销毁。当调试DLL时,会出现这种情况)。在C/C++中,所有的控制是程序员的任务,而不是程序。
ZS我是这样做的。我从一个应用程序中调用一个DLL函数,例如
通过job=false,所有进程被终止,通过delete,所有被分配内存的对象被删除,等等。但是,当你离开时,你在DLL中的所有进程都必须完成。
这可能是问题所在,我不知道,我以为dll在解除连接时完成了自己的进程。
我会考虑如何在退出前终止所有进程,谢谢你的提示。
但只是DLL_PROCESS_DETACH负责,在这种情况下,我们需要强行杀死所有进程。
但这正是DLL_PROCESS_DETACH的职责所在,在这种情况下,所有进程都必须被强行杀死。
它负责DLL与应用程序的解连接。DllMain()负责维护标准的通信协议。DLL_PROCESS_DETACH是关于其他事情的。) 你的进程对它不感兴趣,这完全是你的事情。
在MT中,有一个关机功能。我认为是OnClose()。在这里,从它那里,所有的进程和通过调用适当的函数DLL终止。
它负责断开DLL与应用程序的连接。它对你的过程不感兴趣,完全由你决定。
好吧,我去试试。谢谢你花时间解释这些细微的问题,谢谢你。