Init()和DeInit()执行顺序 - 页 12

 
Andrey Dik:

就这样,哀叹声开始了......

你所要求的正是普通桌面应用程序所不具备的。

应用程序中没有什么?同步?)))

如果开发者不做所有这些已经 "开箱即用 "的功能,MQL程序的编写者将不断面对桌面开发的所有魅力,无论是安全性还是执行速度。

这只是一个没有事实的科学推理。在MT4中,指标以连续的OnInit()和DeInit()操作。有一个缺点--所有指标都在一个线程中工作。这可以通过正确编写指标 来解决,这在MT5中也是需要的。虽然,MT5还没有摆脱它--无论如何,一个图表的指标继续在一个线程中工作。
 
Ihor Herasko:

1.什么--什么不在应用程序中?同步化?)))

2)你在不顾事实地进行不科学的推理。在MT4中,指标的操作是连续的OnInit()和DeInit()。有一个缺点--所有指标都在一个线程中工作。这可以通过正确编写指标 来解决,这在MT5中也是需要的。虽然,MT5还没有摆脱它--无论如何,一个图表的指标继续在一个线程中工作。

1.你说的是什么同步化!

2.在MT4中,作为执行指标代码的一部分,首先执行init,然后是deinit,你还需要什么呢!!!?在MT5中也是如此。


有几个人已经要求我举一个具体的例子,说明在MT5的指标执行范式中执行任务是有问题的。到底会不会有一个例子,一个明确的例子,而不是凭空吸出来的?

 
Andrey Dik:

1.你说的是什么同步?

关于线程间。在一个线程完成之前(给出终止命令的那个),另一个线程不会启动。或者,如果这一切都发生在一个线程中,那就更简单了:终止与 "旧 "TF相关的所有程序,然后才启动 "新 "TF上的程序。

2.在MT4中,作为执行指标代码的一部分,首先执行init,然后是deinit,你还需要什么?在MT5中也是如此。

对。这正是MT4中的情况。但在MT5中却不是这样。而这正是这个主题的意义所在。

有几个人已经要求我举一个具体的例子,说明在MT5的指标执行范式中执行任务是有问题的。到底会不会有一个例子,一个明确的例子,而不是凭空吸出来的?

我前天刚举了三个例子。你没有看到他们吗?
 
Andrey Dik:

这是正确的,他们不应该。因此,你运行总指挥,例如。为什么要求微软照顾到上传/下载TC拷贝到RAM的 "正确 "顺序?这是操作系统的问题吗?

操作系统关心的是,TC不干扰其他TC,他们在RAM中做什么,交换文件或其他什么是他们的事。

"我想是的!"(c) Mimino, 1977年。

总指挥官与此有什么关系?它只是一个低级别的工具,在这个意义上,它直接与系统资源一起运作。在MQL的情况下,MT平台的任务是将应用程序员从同步等系统事务中解放出来--平台可以更有效地、一气呵成地为大家提供这些。MQL程序员必须考虑到对报价和交易策略的分析。这就是MT的目的。

这与文件和数据的交换有什么关系?在MQL程序的背景下考虑工作的逻辑。它只是试图根据事件OnInit/OnDeinit的预期目的来使用它们--正确地从某个状态开始,并正确地通过保存状态来终止自己。如果它们不适合这个目的,那么,正如已经指出的,它们是用来做什么的?根据辩护人的论点判断--这样我们就可以在里面跳舞,找出之前和之后还有哪些副本被执行,从哪个时间段开始,换到了哪个时间段?这与MQ想要达到的效果正好相反--一个副本对另一个副本一无所知。

为了让 一个副本什么都不知道,也不需要发现,而且还能在没有副作用的情况下工作,内核需要知道所有的副本--包括那些被终止的和被启动的--并以标准队列的方式为它们提供优雅的init/deinit事件的处理。反正终端跟踪所有的副本,并使用事件队列,但由于某些原因,init/deinit破坏了事件逻辑。

 
Stanislav Korotky:

为了让一个副本什么都不知道,不需要弄清楚,而且还能在没有副作用的情况下工作,内核需要知道所有的副本--包括那些被终止的和被启动的--并在标准队列隐喻中为它们提供优雅的init/deinit事件处理。终端跟踪所有的副本并使用事件队列,但由于某些原因init/deinit破坏了事件逻辑。

我同意。
 
Andrey Khatimlianskii:

在主变量中存储周期有什么问题?

为什么有必要在不同TFs上连续运行指标之间转移数据阵列?


Andrey,我不喜欢全局终端变量。我曾用它们做过实验(很久以前),我对它们的速度和同步困难感到非常失望。为了避免不被支持,我将尝试写一个例子(稍后),以证明他们的速度。也许有些事情已经改变,我错了。但我不喜欢全局变量的另一点是,它们有自己的生命,而且是绝对公开的。每个人都可以通过按F3检查并删除它们。当有几个人的时候,那是一半的麻烦,但如果每个人都开始使用它们,我个人就会有一种桌子上一片混乱的感觉。

关于传递数组。是的,我同意,这不是经常需要的。但这里有一个具体的例子--我的指标。它的内部操作并不取决于所选择的TF,因为在初始化过程中,它下载了所有(几乎所有)的TF,并创建了自己的通用数组(类似于对数的报价数组),并在此基础上进行一些更浩大的索引数组计算。当改变TF时,每次做一个相同的工作量是完全不合理的--切换TF时将会有延迟。我脑子里也有模式识别的算法,我将实现这些算法,所以初始化计算可能需要几秒钟,我希望它只发生一次,然后忘记它。

Демонстрация индикатора ChannelsProf
Демонстрация индикатора ChannelsProf
  • 2016.02.27
  • www.youtube.com
Скоро на экранах ваших мониторов новый индикатор для MT5 ChannelsProf.
 
Stanislav Korotky:

为了让 一个副本什么都不知道,不需要弄清楚,而且还能在没有副作用的情况下工作,内核需要知道所有的副本--包括那些被终止的和被启动的--并在标准队列隐喻中为它们提供优雅的启动/退出事件处理。反正终端跟踪所有的副本,并使用事件队列,但由于某些原因,init/deinit破坏了事件逻辑。

现在想象一下,不是有一个单一的事件队列,而是有一个针对每个字符周期的队列。有多少个符号周期,就有多少个队列。

现在提出处理这些队列的顺序。

 
Slawa:

现在想象一下,不是有一个单一的事件队列,而是每个符号周期都有一个队列。有多少个符号周期,就有多少个队列。

现在提出处理这些队列的顺序。

一个队列是一个窗口属性。每个符号周期的一个队列对接口事件来说是不正确的。那么你是如何处理鼠标点击的呢?
 
Ihor Herasko:

1.关于线程间。在一个线程完成之前(给出终止命令的那个),另一个线程不会启动。或者,如果所有这些都发生在一个线程中,那就更简单了:我们终止所有与 "旧 "TF相关的程序的执行,然后才在 "新 "TF上启动程序。

2.对。这在MT4中是完全一样的。但在MT5中却不是这样。这就是这个主题的意义所在。

3.我前天一看就举了处理图形对象 时,一种美感油然而生:一个指标仍然存在,还没有清理,而第二个指标正在这些对象上绘图。这就是我们将如何向用户解释:"当切换TF时,你将观察到短期干扰"。)))
  • 与DLL一起工作。当你Deinit DLL时,应该中断所有的线程,这些线程是由它创建的。之后的下一个指标副本为自己重新创建它们。现在我们得到的是,新的指标副本将试图创建所有这些线程,它将被拒绝,因为它们仍在运行。新的指标将产生一个错误信息,不会工作。只是因为TF的切换。是的,这个问题是可以解决的。
  • 1)应该像我之前写的那样:积累的数据库应该定期保存到文件或其他存储中,没有问题--打开文件,写入,关闭。你需要在每次更新这些数据时或定期进行,而不是在init和deinit时进行。(当你写一个程序,写一篇文章时,你会定期保存工作)。而且不可能对写入文件的失败进行保险,有时为了保险,在极其重要的情况下,他们会做以下工作:将更新的信息写入一个新的文件,在写入成功后,他们会删除旧的文件,并将新文件的名称改为旧的文件。

    2)我已经解释过了。每个指标必须与自己的图形对象一起工作。当然,我们必须检查对象的存在,如果它们已经存在,我们必须在对象的名称上加1。

    3)好吧,你已经写了,它是可以解决的。

    而这些根本就不是问题。这是程序的正常操作--创建独特的对象,定期保存积累的信息,完成后进行清理。

     
    Andrey Dik:

    1.这些是你的愿望。但你说你想要的是桌面应用程序的工作方式,所以你想要的桌面应用程序的工作方式并不可行。

    你怎么称呼桌面应用程序?感觉MT5不是一个桌面应用程序。

    2.不要编造故事。在MT4和MT5中,oninit和ondeinit的顺序是相同的。不存在以deinit开头的程序。

    这不是我编的。这就是目前的主题。重点是,MT5可以为尚未DeInit的指标执行Init。是的,它是。你没有读过这个主题吗?

    3) 好的,让我们分析一下这些例子。

    1)按我前面写的做:积累的数据库应定期保存到文件或其他存储器中,没有问题--打开文件,写入,关闭。你需要在每次更新这些数据时或定期进行,而不是在init和deinit时进行。(当你写一个程序,写一篇文章时,你会定期保存工作)。而且不可能对写入文件的失败进行保险,有时为了保险,在极其重要的情况下,他们会做以下工作:将更新的信息写入一个新的文件,在写入成功后,他们会删除旧的文件,并将新文件的名称改为旧的文件。

    试着每秒钟更新同一个文件几次,并分享你的感受。

    2)我已经解释过了。每个指标必须与自己的图形对象一起工作。当然,我们必须检查对象的存在,如果它们已经存在,我们必须在对象的名称上加1。

    这与在名字上加1有什么关系?这是关于有来自同一指标的图形对象,但在同一时间在屏幕上有不同的副本的事实。技术上没有冲突。对于看到屏幕上的懊恼的用户来说,会有一个冲突,直到旧的副本被删除。

    3)好吧,你已经写了,它是可以解决的。

    这根本不是一个问题。这是正常的程序操作--创建独特的对象,定期保存积累的信息,完成后进行清理。

    我告诉你一个大秘密:每个终端拷贝有一个DLL的拷贝。你不能使用它们的多个副本。