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

 
Koldun Zloy:

我将翻译MT开发公司的代表已经告诉你的内容。

你不能从MQL创建线程。即使使用WinAPI也不行。

你只能通过编写你自己的DLL来做到这一点。

WinAPI和使用标准的dll !

kernel32.dll
user32.dll

等。

多线程工作的目的是用WinAPI函数,而不是用mql函数。
但不幸的是,你不能用mql函数进行多线程工作。

 
Roman:

WinAPI并使用标准的dlls !

kernel32.dll
user32.dll

嗯,正好相反,WinAPI是作为动态库kernel32.dll , user32.dll实现的。

你从来没有尝试过用纯C++编写一个通常的Windows窗口,上面写着 "Hello Word!"的文字。- 网上有一些例子,写下你的第一个 "Hello Word!- 它自己就会清除;)

 
Igor Makanu:

嗯,正好相反:WinAPI是作为动态库kernel32.dll , user32.dll实现的。

你从来没有尝试过用纯C++编写一个通常的Windows窗口,上面写着 "Hello Word!"的文字。- 网上有一些例子,写下你的第一个 "Hello Word!- 很多东西都会自己清楚起来的;)


标准是指标准的Windows dlls,标准并不意味着它们是静态的.lib。

伊戈尔,你走错路了......
"Hello Word!"与dll的初始化有什么关系,并在你的线程中调用它的函数 !

比如说。
有一个WinAPI函数MessageBoxW()。
它必须在自己的线程中调用。

为此,你需要初始化dll本身和导出的函数,你能举例说明如何正确操作吗?

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

然后在初始化之后,用CreateThread()调用MessageBoxW(); 。
函数执行完毕后,释放资源并关闭线程。
给我一个例子,如何在mql中正确操作?

 
我目前正在研究一个多线程的系统。但不是在MCL中,而是在标准C++中。啊,有多少个耙子)。
 
Roman:


标准是指标准的Windows dll,标准并不意味着它们是静态的.lib。

伊戈尔,你走错方向了......
"Hello Word!"与dll的初始化有什么关系,并在你的线程中调用它的函数 !

比如说。
有一个WinAPI函数MessageBoxW()。
它必须在自己的线程中调用。

为此,你需要初始化dll本身和导出的函数,你能举例说明如何正确操作吗?

然后在初始化之后,用CreateThread()调用MessageBoxW(); 。
执行完函数后,释放资源并关闭线程。
给我一个例子,如何在mql中正确操作?

你走错了路,有人告诉你--写一个dll(其中你必须分配内存并注册一个新线程!)。- 然后在退出时小心翼翼地销毁一切!)并从MQL中调用它。

在你的例子中,内存分配和进程注册在哪里? MessageBox的调用--这意味着MQL程序已经分配了它的资源,但还没有创建一个独立的线程。 我甚至不想检查它,但当MessageBox被调用时,终端应该冻结。

 
Igor Makanu:

你走错了路,我告诉过你--写一个dll并从MQL中调用它。

你调用MessageBox的事实--这只意味着MQL程序已经提供了它的资源,但没有创建一个独立的线程。 我甚至不想检查它,但当你调用MessageBox时,你的终端应该冻结。

Igor,我引用了初始化dll函数作为例子来理解我所说的。 但我不知道如何在mql中正确地做,纯C++会让人误解。
mql本身的特殊性可能会引起混淆。这就是为什么我在论坛上寻求帮助,而不是向谷歌求助。
为什么我需要写一个dll,因为WinAPI是建立在dll上的,可调用的函数已经在user32.dll 中了,例如
?我创建这个主题是为了理解这个问题,如何在mql中正确地做,你告诉我内存分配 和进程注册在哪里))。
给我看一个适当的例子,如何在mql中做到这一点?
或者指导我去找一个好的指南。

 
Roman:

Igor,我给出了dll的初始化函数作为例子来理解我的意思,但我不知道如何在mql中正确操作,纯C++可能会有误导。
mql本身的特殊性可能会引起混淆。这就是为什么我在论坛上寻求帮助,而不是向谷歌求助。
为什么我需要写一个dll,因为WinAPI是建立在dll上的,可调用的函数已经在user32.dll 中了,例如
?我创建这个主题是为了了解在mql中如何正确地做这个问题,你告诉我内存分配 和进程注册在哪里))。
给我看一个适当的例子,如何在mql中做到这一点?
或者指导我去找一个好的指南。

你不能从mql程序中创建一个线程,即使使用WinAPI也不行。

 
Roman:

Igor,我举了一个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软件公司。, 2019.07.24 16:31

不能从DLL中调用MQL函数

但是可以通过DLL调用来运行多个线程,使它们在其环境中独立于MQL5工作。

例如,你从MQL中准备数据,将其放置在某处或传递给DLL,而DLL将在多个线程中执行任务,并通过附加函数返回结果。


调用Windows API函数是来自dll的调用,这意味着可以使用CreateThread();
为Windows API函数创建线程CreateThread();被移植到标准mql库不是没有原因 的。

 
Roman:

对Windows API函数的调用是来自dll的调用,所以对于Windows API函数,可以使用CreateThread()创建线程
CreateThread();被移植到标准mql库是有原因的

没有人移植任何东西,你在包里看到的只是函数签名。

要创建一个流程,你需要一个函数体--这就是将在流程中运行的函数体。

要在Windows中注册一个线程,你需要填入结构。

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

lpStartAddress - 这是函数的入口点地址,将在线程中运行,不用担心内存分配 问题

要解决这个问题,你需要找到一个机会来获得MyFunc()的地址--在内存中,而它是不存在的--好吧,根本就不存在......没有!


我不知道该如何解释这个问题......。这并不存在 ))))