//#include <iostream>template<typename T>
class A{
public:
typedefvoid (*callback)(T&); //class namespace for function pointer type
callback f_ptr;
T data;
};
template<typename T>
class B{
public:
typedefvoid (*callback)(T&); //class namespace for function pointer type
callback f_ptr;
};
template<typename T>
void func(T& value){
++value;
}
voidOnStart(){
//int main(){
A<int> a;
B<int> b;
a.f_ptr = func<int>; // automatic code generation of templates functions
b.f_ptr = a.f_ptr; // assignment operation for function pointers with the same function signatures and different function pointer types.int x = 1;
b.f_ptr(x);
printf("%d\r\n", x); //2printf("%d\r\n", b.f_ptr == a.f_ptr); //1 // equal operation for function pointers with the same function signatures and different function pointer types.
}
所以你没有把控制权送回终端,你在DLL中的Fn里面 "挂 "了一个 "无限 "循环。
我们谈论的是什么样的正常终止!?
如果你需要这样的行为,你应该在DLL中的Fn内部运行一个单独的线程,该线程应该被一个标志所停止,该标志在一个单独的函数FnStop和DLL_PROCESS_DETACH中设置。
事实上,我并没有得到控制权,它的做法是,例如,很明显,而应该在一个单独的线程中运行,以便不阻塞mql线程。
但当我在另一个线程中运行时,我得到了同样的行为,问题是在DLL_PROCESS_DETACH中,这个标识符不起作用,对于现有的标志Detach。
是的,我们已经写过了,我们需要创建单独的导出函数,用它来控制这个标志。
但如本例所示,DLL_PROCESS_DETACH中的标志并没有发挥作用。
也许在终端有一个错误,DLL_PROCESS_DETACH应该把标志转移到另一个状态,这是合乎逻辑的。
while循环得到这个状态,退出循环,沿途遇到的任何东西都被执行,并终止Fn()函数本身。
只有在这之后,才应该卸载dll!
但这并没有发生,我们得到了某种被隐藏的终端机制提前卸载的dll,所以我们得到了一个崩溃。
我不希望像你、费多谢耶夫等无能的人参与讨论错误和构造。
因此,在MQL中从C++中提取的结构和机制的全部内容和外观与C++中相同,将与C++中的工作相同。
这是胡说八道,你也知道,但你必须把它扔在那里。是你在抱怨这有多烦人,抱怨一种单独的语言和一个单独的主题。
为你自己和你的同情者开一个单独的主题,在那里发牢骚。
我对你有更好的评价。我的错误。它发生了。你是粗鲁的,而且...不聪明。
它是为例子而做的,而应该在一个单独的线程中运行,这样就不会阻塞mql线程。
当我在另一个线程中启动时,我得到了同样的行为,问题是在DLL_PROCESS_DETACH中,这个标识符不起作用,对于现有的标志Detach。
是的,我们已经写过了,我们需要创建单独的导出函数,用它来控制这个标志。
但如本例所示,DLL_PROCESS_DETACH中的标志并没有发挥作用。
也许在终端有一个错误,DLL_PROCESS_DETACH应该把标志转移到另一个状态,这是合乎逻辑的。
while循环得到这个状态,退出循环,沿途遇到的任何东西都被执行,并终止Fn()函数本身。
只有在这之后,才应该卸载dll!
但这并没有发生,我们得到了某种被隐藏的终端机制提前卸载的dll,所以我们得到了一个崩溃。
不收回控制权只是一个例子,很明显,while应该在一个单独的线程中运行,以免阻塞线程
关于交易、自动交易系统和交易策略测试的论坛
虫子,虫子,问题
Sergey Dzyublik, 2019.05.26 15:12
不幸的是,目前MT4/MT5的功能指针类型非常有限,由于一些缺陷,并不实用。#(未在MT5(build 2118)中修复)"当在typedef中重复使用同一函数签名时出现编译错误"。
#(未在MT5(build2118)中修复)"当使用typedef时,使用具有明确专业化的模板函数不会生成该模板函数的代码"。
鉴于命名空间的实施尚未完成,请考虑在下一个C++ 中实现对这一行为 的支持,作为缺陷修复的一部分。
MT5(build 2118),我们还能等多久来修复类型化 功能的错误?
一些无稽之谈--在使用typedef 的原始例子上向左走了一步,仅此而已--一堆错误 阻碍了进一步发展。
让我猜猜看。如果你在一个终端线程中运行一个来自dll的循环,它会挂起,但如果你在一个单独的线程中运行它,并将其分离(),终端就会出错崩溃?
并非如此。
启动一个循环可以正常工作。
问题是当你强行停止程序并向循环传递一个标志以退出循环并终止一个正在运行的函数。
但终端不允许退出循环并正确终止运行中的函数,因为早期的dll卸载已经被触发了。我们得到了一个悬念。
dll在传递标志状态之前被卸载,Fn函数没有终止,提前卸载会破坏一切。
例如,我是在终端线程中做的,以避免写所有的代码,因为在阻塞模式下,问题会被更好地看到。
我为循环标志创建了一个单独的函数,运行中的循环在不同的线程中运行,但行为相同。
而当我试图从非锁定的mql代码中把标志切换到另一个状态时,通过一个函数来退出循环。
终端不等待运行中的循环结束,也不让Fn函数在循环运行的地方结束。
终端机立即执行早期的dll卸载,无需等待Fn功能完成。这就是问题所在。
所以,请马上举出一个适当的例子。不要管attachi detachi。
在锁定模式下,你可以更好地看到这个问题。改变国旗的状态其实并不重要。有一个入口点或一个单独的功能。
这个入口点对锁定模式更好,因为控制权不被传回,而且不能调用 改变标志的函数。 这就是为什么用阿塔奇-德泰奇作为例子。
阿塔奇的可拆卸性被搁置了,按照你的建议做了一个单独的函数,没有运气,在非阻塞模式下的一个工作项目上,有同样的行为。
dll被提前卸载,带有while循环的运行函数没有时间完成而挂起。
dll被提前卸载,一个正在运行的带有while循环的函数没有时间终止而发生挂起。
在正常的执行过程中,不可能有任何障碍。
有人在使用自定义符号时遇到过以下问题吗?CustomRatesUpdate函数收到了正常的报价,但事实上,图表和数据窗口包含了一些奇怪的东西(在这种情况下,收盘价和低价值比传递的要少100倍)。
另外,在平行的情况下,用CustomTicksAdd模拟单点,其收盘价值与日志中的相同(紧接CustomRatesUpdate之前),也就是说,不清楚报价中减少的值来自哪里。
UPD。
我在美元兑加元上得到了 "反向 "的情况--写完后报价增加了10倍。这是我得到的日志。
第一个ArrayPrint是在CustomRatesUpdate中写入的内容,第二个ArrayPrint是在写入后立即使用CopyRates从最近的一个条形图中读取的内容。首先,差异是开盘的最后一位数字,但更重要的是,高点和收盘都增加了10倍。
有人在使用自定义符号时遇到过以下问题吗?CustomRatesUpdate函数收到了正常的报价,但事实上,图表和数据窗口包含了一些奇怪的东西(在这种情况下,收盘价和低价值比传递的要少100倍)。
另外,使用CustomTicksAdd平行模拟单点,收盘价的数值与日志中相同(紧接CustomRatesUpdate之前),也就是说,不清楚报价中减少的数值来自哪里。
是的,我遇到过,但我的空是不清楚的。你有100倍的尖峰数量。
请在这个主题中重复这个问题我做了一个额外的零点检查,但没有帮助,它的工作方式完全错误,它正在绘制这样的尖峰。
主要是在我第一次启动程序时观察到这种行为,以及第一次创建不存在日期的历史文件时。
清理了文件夹里的蜱虫,修正了代码,为了找到错误所在,闷头苦干,暂时推迟,还得回到这个问题上()
还要检查文件夹的自定义历史,可能有日期不存在的文件 ))
一般来说,虫子住在那里的具体。
我想斯拉瓦是负责那里的定制角色的。
要提醒大家注意这个问题。
这个错误以前是否被提及过?找不到了。一句话:当从缓存文件加载优化结果时,前向结果显示不正确。参数值有错误的数字。
你去优化标签。选择专家顾问。选择前一种优化方式。回溯测试被正常加载。前锋给了这个。
MT5,最新版本,x64。