文章 "基于 .Net 框架和 C# 开发图形界面(第二部分):另外的图形元素" - 页 2

 
fxsaber:

已检测到使用 C# 窗口工作时的一个非常严重的错误。如果连续移动 C# 窗口,终端会在几秒钟后从屏幕上消失,terminal64.exe 的 CPU 核心负载超过 100%。我有 8 个内核,因此任务管理器中 CPU 的全内核负载为 12%-13%。当 C# 窗口移动时,则为 19%。

哦,真酷。试了一下,真的消失了。或者说,它并没有消失,而是最小化到了托盘,就像你按了 "最小化 "按钮一样。

至于 100% 加载,我没看到。也许是因为你内置了而我没有。

 
fxsaber:

通过终端菜单手动删除GuiControllerElementsDemo 会导致程序冻结几秒钟。

确实有这种情况。只有在没有事先手动关闭表单的情况下才会发生。我还不知道如何解决这个问题。我试过用几种方法在 Deinit() 中关闭表单,但都没有成功。如果有人知道怎么做,我将不胜感激。

 
Vasiliy Sokolov:

是这样的。只有当你没有事先手动关闭表单时,才会出现这种情况。我还不知道如何解决这个问题。我尝试了几种在 Deinit() 中关闭表单的方法,但都不奏效。如果有人知道怎么做,我将不胜感激。

为什么标准处理程序 private void Form2_FormClosing(object sender, FormClosingEventArgs e)

不工作?

当我用 C# 进行 dll 实验时,由于某种原因,在退出时一切都崩溃了,因为我没有销毁在表单本身之外创建的组件,事情就是这样:

public partial class Form2 : Form

    {

        static RichTextBox CopyToClipboard;

.....

private void Form2_FormClosing(object sender, FormClosingEventArgs e)

        {

 CopyToClipboard.Clear();

 CopyToClipboard = null;

就是这样:如果我没有在从 MQL 关闭窗体之前销毁组件,运行速度就会非常慢或崩溃。

 
Vasiliy Sokolov:

哦,酷。我试了一下,它确实消失了。或者说,它没有消失,而是最小化到了托盘,就像按了 "最小化 "按钮一样。

我试着移动终端窗口(C# 没有运行)。大约 10 秒钟后,所有窗口(ME、浏览器等)都最小化了,只剩下桌面。

至于 100% 加载 - 我没看到。也许真的是因为你内置了加载功能,而我没有。


同时,我监控了智能交易系统的执行情况。结果如下

2019.06.11 17:37:29
2019.06.11 17:37:30
2019.06.11 17:37:54
2019.06.11 17:38:06
2019.06.11 17:38:07
2019.06.11 17:38:08

您可以清楚地看到,当终端窗口移动时,智能交易系统停止了工作。

 
fxsaber:

同时,我还监控了智能交易系统的执行情况。结果如下

可以清楚地看到,当终端窗口移动时,EA 停止了工作。

我通过计时器进行了检查,没有发现任何挂起。它很快就将所有内容都发送到了日志中。

 
Igor Makanu:

以及为什么要使用标准处理程序 private void Form2_FormClosing(object sender, FormClosingEventArgs e)

不工作?

当我用 C# 进行 dll 实验时,由于某些原因,在退出时一切都崩溃了,因为我没有销毁在表单本身之外创建的组件,事情就是这样:

就是这样:如果我在关闭 MQL 表单之前没有销毁组件,表单的运行速度就会非常慢,甚至会崩溃。

我试图通过标准的 form.Dispose() 来实现。也就是说,当调用 GuiController::HideForm() 时,会调用相应表单的 Dispose。 在 C# 的测试程序中一切正常。但在 MT 中却行不通。但如果我们在删除智能交易系统之前手动关闭表单,则一切正常。

 
Vasiliy Sokolov:

我尝试通过标准的 form.Dispose() 来实现。也就是说,当调用 GuiController::HideForm() 时,会调用相应表单的 Dispose。 在 C# 的测试程序中一切正常。但在 MT 中却行不通。但如果我们在删除智能交易系统之前手动关闭表单,一切都会正常。

在这里,它被立即卸载。

 
fxsaber:

在这里 可以立即卸载。

是的,我看过你的面板。你用什么函数卸载?

 
Vasiliy Sokolov:

我尝试通过标准的 form.Dispose() 来实现。也就是说,当调用 GuiController::HideForm() 时,会调用相应表单的 Dispose。 在 C# 的测试程序中一切正常。但在 MT 中却行不通。但如果我们在删除智能交易系统之前手动关闭表单,一切都会正常。

您一定要去谷歌搜索一下,因为有些程序还在运行。

或者,您仍然需要在 Windows 中调用 Form.Close() 来关闭应用程序。

https://stackoverflow.com/questions/3097364/c-sharp-form-close-vs-form-dispose

不调用 "关闭 "可能会绕过发送大量 Win32 消息的过程,虽然我无法具体说明原因,但我认为这些消息还是很重要的...

关闭的好处是可以引发事件(可以取消),这样(表单的)外部人员就可以监视 FormClosing 和 FormClosed,以便做出相应的反应。

我不清楚如果只是处置表单,是否会引发 FormClosing 和/或 FormClosed 事件,但我可以把这个问题留给你去试验。


Vasiliy Sokolov:

是的,我看过您的面板。您使用什么函数卸载?

在调用 .dll 时,我会创建 2 个线程,通过 ShowDialog() 运行其中的每个窗体,然后通过调用Close() 方法杀死窗体,并释放内存以防万一 - 我不知道 .Net ))))) 中的垃圾回收器是如何工作的。
public static class FormsMT5
    {
        private static Form1 MainForm;
        private static Form2 OrderForm;
	 private static Thread ThreadMainform, ThreadOrderForm;
....................
 

public static void FormDeinit(int reason)
        {
            if (reason == 3 || reason == 5) return;
            if (MainForm != null)
            {
                MainForm.Close();
            }
            if (OrderForm != null)
            {
                OrderForm.Close();
            }
            if (ThreadMainform != null) ThreadMainform.Join();
            if (ThreadOrderForm != null) ThreadOrderForm.Join();
            MainForm = null;
            OrderForm = null;
            ThreadMainform = null;
            ThreadOrderForm = null;
        }
C# Form.Close vs Form.Dispose
C# Form.Close vs Form.Dispose
  • 2010.06.22
  • topgun_ivardtopgun_ivard 3,91683142
  • stackoverflow.com
I am new to C#, and I tried to look at the earlier posts but did not find a good answer. In a C# Windows Form Application with a single form, is using better or ? MSDN says that all resources within the object are closed and the form is disposed when...
 
Vasiliy Sokolov:

是的,我看过你的面板。你用什么函数卸载?

那是伊戈尔 的面板。我刚刚发布了