为了系统安全,每次 DLL 调用都要经过一个特殊的剥离器,这会减慢执行速度。DLL 函数调用不是一个平庸的调用 XXXX,而是一个复杂的包装,包括地址屏蔽、堆栈控制和 DLL 内部的崩溃。MQL5 使其能够在 DLL 内部的函数扰乱堆栈或崩溃时停止脚本执行,而不会使终端本身崩溃。
关于使用 DLL 函数的一般建议:尽量少调用内含大量工作的函数,而不是每秒调用数万次并传递少量结果的函数。
我想知道为什么不更进一步呢?
正如 Renat 指出的那样,从 dll 调用廉价函数的成本很高。
那么为什么不直接将数据复制到为此提供的数组中呢?
我想知道为什么不更进一步呢?
这个问题是问谁的--作者还是开发者?
如果是对开发者,你有什么具体建议?
StringExplode 函数是否存在错误?就目前的形式而言,如果字符串的最后一个分量后面没有分隔符(即字符串的末尾),则该函数不会复制该分量。在我看来,即使字符串末尾没有分隔符,也应该复制字符串的末尾。例如:我们在输入字符串"EURUSD,EURJPY "时加上了分隔符",",现在函数只选择 EURUSD。
以下是更正后的函数版本,为方便起见,我返回了元素个数:
int StringExplode(string s, string separator, string &result[]) { int i, pos; ArrayResize(result, 0); for(i = 0; ; i++) { ArrayResize(result, ArraySize(result) + 1); pos = StringFind(s, separator); if(pos >= 0) { result[i] = StringSubstr(s, 0, pos); s = StringSubstr(s, pos + StringLen(separator)); } else { result[i] = s; i++; break; } } return(i); }
对于那些频繁调用 Get/Set 等 DLL 函数的用户来说,有一个非常严重的警告。
为了系统安全,每次 DLL 调用都要经过一个特殊的剥离器,这会减慢执行速度。DLL 函数调用不是一个平庸的调用 XXXX,而是一个复杂的包装,包括地址屏蔽、堆栈控制和 DLL 内部的崩溃。MQL5 使其能够在 DLL 内部的函数扰乱堆栈或崩溃时停止脚本执行,而不会使终端本身崩溃。
使用 DLL 函数的一般建议是:尽量少调用内部工作量大的函数,而不是每秒数万次调用并传输少量结果的函数。
顺便提一句,关于多次调用 DLL 的问题--在测试过程中,我注意到每次调用都会出现几个字节的内存泄漏。
StringExplode 函数没有错误吗?在目前的形式下,如果字符串的最后一个分量后面没有分隔符(即字符串的末尾),它就不会复制该分量。在我看来,即使字符串末尾没有分隔符,也应该复制字符串的末尾。例如:我们在输入字符串"EURUSD,EURJPY "时加上了分隔符",",现在函数只选择 EURUSD。
以下是更正后的函数版本,为方便起见,我返回了元素个数:
谢谢,我没注意。您可以看到,描述符中的最后一个元素是一个随机数,没有任何意义。
---------
谢谢!我会尽可能落实所有改进建议。这个想法本身很好,我希望它不要停滞不前。
多么复杂啊!...
一年前,在伊尔努尔的帮助下,我用 MQL4 编写了一个处理内存的库。你可以分配内存、移动指针、写入和读取、将内存区域的名称传输给其他程序。
一切都基于映射。它比提议的库简单得多。
多么复杂啊!...
一年前,在伊尔努尔的帮助下,我用 MQL4 编写了一个处理内存的库。你可以分配内存、移动指针、写入和读取、将内存区域的名称传输给其他程序。
一切都基于映射。它比建议的方法简单得多。
对于那些频繁调用 Get/Set 等 DLL 函数的用户来说,有一个非常严重的警告。
为了系统安全,每次 DLL 调用都要经过一个特殊的剥离器,这会减慢执行速度。DLL 函数调用不是一个平庸的调用 XXXX,而是一个复杂的包装,包括地址屏蔽、堆栈控制和 DLL 内部的崩溃。MQL5 使其能够在 DLL 内部的函数扰乱堆栈或崩溃时停止脚本执行,而不会使终端本身崩溃。
使用 DLL 函数的一般建议:尽量少调用内含大量工作的函数,而不是每秒调用数万次并传递少量结果的函数。
新文章 指标间的数据交换:易如反掌!已发布:
我们希望创建这样一个环境,即能够提供对附加于图表的指标的数据访问,并具有以下属性:没有数据复制;只需稍加修改我们需要使用的可用方法的代码;MQL 代码优先(当然,我们必须使用 DLL,但我们将只使用一些 C++ 代码字符串)。本文介绍了为 MetaTrader 终端开发程序环境的简易方法,这将提供从其他 MQL 程序访问指标缓冲区的方法。
作者:Алексей