下午好
代码如下
void __fastcall TForm1::FormActivate(TObject *Sender) { AnsiString path_MemMap32=ExtractFileDir(ParamStr(0)) + "\\dll\\MemMap32.dll"; AnsiString path_file="Local\\Monitor_USDCHF"; wchar_t * UnicodeString = new wchar_t[path_file.WideCharBufSize()]; path_file.WideChar(UnicodeString,path_file.WideCharBufSize()); delete [] UnicodeString; int (__stdcall *MemOpen) (char * path,int size,int mode,int &err); void (__stdcall *MemClose)(int hmem); int (__stdcall *MemRead)(int hmem, int v[], int pos, int sz, int &err); HINSTANCE hDLL= LoadLibrary(path_MemMap32.c_str()); if(!hDLL) {StatusBar1->SimpleText="I can't load dll";} else {StatusBar1->SimpleText="path_MemMap32.dll load";} MemOpen= (int(__stdcall *)(char * path,int size,int mode,int &err)) GetProcAddress(hDLL,"MemOpen"); MemClose=(void(__stdcall*)(int hmem)) GetProcAddress(hDLL,"MemClose"); MemRead= (int(__stdcall *)(int hmem, int v[], int pos, int sz, int &err)) GetProcAddress(hDLL,"MemRead"); hmem=MemOpen(path_file.c_str(),-1,0,err); StatusBar1->SimpleText=err; }
状态栏显示 2,即未找到文件,我尝试用 ansi 和 unicode 发送文件路径。
在 MT5 文件中,Expert Advisor 创建了一个文件并更新了其中的报价。
如果您有 C++,为什么决定使用 DLL?
源代码完全可以在这里找到。
如果您有 C++,为什么决定使用 DLL?
源代码完全可用。
我想使用现成的 DLL。
这样在使用 MT4-5 时就不会有问题。
...我会试着查看 DLL 的源代码
我想使用现成的 dll。
这样在 MT4-5 中拼写就不会有问题。
...我会尝试查看 dll 的源代码。
您的 Windows 系统是什么?
win7x64
我不能用 Builder 书写。
也不能这样写。
#include <vcl.h> #include <stdafx.h> #include "BuySell.h"我明白了。
[C++ Fatal Error] afxv_w32.h(14): F1003 Error directive: WINDOWS.H already included. MFC apps must not #include <windows.h>
我先试着连接
afxv_w32.h
没用
我试着先插入 afxwin.h - 也没用。
我先试着插入 afxwin.h - 但也无济于事。
寻找连接的 afx.h 作为另一个选项。
是的,所以它是连接的,不会出错,我会继续尝试。谢谢。
...
我成功了,一切正常。
但由于某些原因,CloseHandle 没有关闭。
我的 exe 中有一个服务器(创建更新并应关闭),终端中有一个接收器,因此服务器中的 CloseHandle 关闭后,会在内存中看到失败的对象。
我在 echo 中有一个服务器(它更新并关闭服务器),在终端中有一个接收器,因此在服务器中关闭句柄后,接收器会在内存中看到失败的对象。
您是否希望在关闭手柄时完全清除内存?
下午好
请告诉我思维发展的方向。
有一项任务是在一台计算机(服务器)内的许多终端上分发信号,关键延迟超过 1-3 毫秒。
在客户端-服务器的捆绑中实施,1-2 个账户的工作可以接受,并且不会挂起终端,从内存中使用 Sleep(1) 循环读取 - 如果内存需要必要的值,则执行某些操作。但当终端甚至是 5 个终端时,这里的 1 毫秒是不可行的,否则处理器上的冷却器就会开始嚎叫......
我很久没有关注新闻了,也许在 mt5 中会有类似 OnTrade 的自定义事件,这样它们就可以与内存修改联系起来。
我试过无延迟读取 100 000 个周期(每个周期 8 个字节),在 670 毫秒内通过。
...也许我应该将数据减少到 4 字节。
...也许还有另一种方法可以重建您的 dll,使其在内部循环 - 不返回数据,直到它们不接受所需的值。
有一项任务是将一台计算机(服务器)内的信号分配给许多终端,延迟超过 1-3 毫秒至关重要。
在客户机-服务器捆绑程序中,1-2 个账户的工作是可以接受的,而且不会挂起终端,因为在一个循环中使用 Sleep(1) 从内存中读取数据--如果内存需要必要的值,我们就会执行一些操作。但是,当终端甚至是 5 个终端时,这里的 1 毫秒是不可行的,否则处理器上的冷却器就会开始嚎叫......
我很久没有关注新闻了,也许在 mt5 中会有类似于 OnTrade 的用户事件,这样它们就可以与内存修改联系起来。
在您的情况下,只有服务器有权修改内存。
- 看看Pipe 的方向。那里数据到达的 "事件 "是不言自明的 - 如果有数据,我们就获取,如果没有,我们就等待。
是的,服务器需要编写或从 MSDN 复制,但现成的客户端可以直接在 MQL5 中使用。
不幸的是,这里也无法处理轮询的周期性问题。 即使在使用内存的情况下,如此多的智能交易系统中的 Sleep(1) 也不应该产生噪音。 您需要检查函数的时序,也许在某个地方有额外的传递和加载。
行情监视 (内存映射文件):
这个 EA 是利用内存映射 DLL 与文件映射功能的例子。在此例中, EA 创建一个虚拟 (内存映射) 文件并开始更新符号行情。使用这种方式, EA 可以使用常用内存映射文件来交换数据 (例如, 行情)。
作者: o_O