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