Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winforms 线程UI和噩梦_Winforms_Multithreading_User Interface - Fatal编程技术网

Winforms 线程UI和噩梦

Winforms 线程UI和噩梦,winforms,multithreading,user-interface,Winforms,Multithreading,User Interface,我有一个类,在它启动的线程中处理一些实时操作。由于这个应用程序非常复杂,因此还有其他的Thead在使用。当这个rt动作开始时,我需要弹出一个窗口,完成后关闭它。听起来很简单 当这个动作开始和停止时,我会钩住一些事件。在这些事件处理程序中,我放置代码: private void Voice_SpeakStarted(object sender, TMSpeakStartedEventArgs e) { InfoWindow = new Form();

我有一个类,在它启动的线程中处理一些实时操作。由于这个应用程序非常复杂,因此还有其他的Thead在使用。当这个rt动作开始时,我需要弹出一个窗口,完成后关闭它。听起来很简单

当这个动作开始和停止时,我会钩住一些事件。在这些事件处理程序中,我放置代码:

        private void Voice_SpeakStarted(object sender, TMSpeakStartedEventArgs e)
    {

        InfoWindow = new Form();
        InfoWindow.Show();
    }

    /// <summary>
    /// this is the event handler speaking stops
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Voice_SpeakCompleted(object sender, TMSpeakCompletedEventArgs e)
    {
        if (InfoWindow.InvokeRequired)
        {
            InfoWindow.Invoke(new Action(() =>
            {
                InfoWindow.Close();
            }));

            InfoWindow.Hide();
        }
    }
类的构造函数是

    public AnimationControl(dynamic parent)
    {
        Parent = parent;
        Voice = new Speech();

        q = Queue.Synchronized(new Queue(1000));
        start();
    }

您应该专门化您的线程,并停止从任何线程调用由其他线程管理的代码。使用消息队列与线程通信操作。这是执行多线程最安全的方法

伪代码中的示例:

Thread1
{
  while (1)
  {
    read my last message in my queue;
    do something according to this message like:
    openwindow();
    or closewindow();
  }
}

Thread2
{
  My life is short, I just need to post a message to thread1
}


Thread3
{
  etc.
}

在每个系统上都有这样的现成结构。通过这样做,我们将更容易理解在出现这样的问题时会发生什么。当然,如果你不小心,你的线程程序会变得绝对线性;目标是确保操作的某些部分可以并行执行,并且不会创建一个线程链,一个接一个地等待:)

对于一件事,即使
invokererequired
返回true,也要在错误线程的窗口上调用
Hide

我还可以猜测,您正在一个新线程上创建
Voice
实例,并在收到“关闭”消息时返回,因此有时会终止您试图通过windows消息路由的线程。考虑保持线程直到窗口实际上关闭。< /P>
是的,您应该发布更多的代码,没有一行代码显示您如何创建/处置该线程。

有关线程终止错误和UI线程的一般信息,请查看我的回答:

什么是
进程列表
?什么课?添加一些上下文!
Thread1
{
  while (1)
  {
    read my last message in my queue;
    do something according to this message like:
    openwindow();
    or closewindow();
  }
}

Thread2
{
  My life is short, I just need to post a message to thread1
}


Thread3
{
  etc.
}