日期:2014-05-17  浏览次数:21383 次

在线程中显示窗口卡死
功能是:主窗体上有一个按钮,点击之后在桌面的右下角显示一个提示窗口。

现在点击按钮的时候,另起了一个线程处理提示窗口的显示,在显示提示窗口和消失提示窗口之间用了Thread.sleep()函数来控制显示时间。

在显示的过程中,提示窗体是卡死状态,也就是鼠标移到窗体上的时候是显示等待的状态。但是不把显示提示窗体的功能放在线程中就不会出现这种情况,求教大家了。

------解决方案--------------------
有没有用到Control.Invoke,有没有在这个委托中包含能让线程挂起的代码。
------解决方案--------------------
你是不是在线程中是不是这样操作的:

            Form2 f = new Form2();
            f.Show();
            Thread.Sleep(5000);

这样的话,是会导致界面等待的,因为你让线程Sleep了,而且窗体的关闭是因为Thead执行完成,资源释放而关闭的,f.Show()执行完成后,窗体不会等待,而是直接执行Thread.Sleep,而如果是ShowDialog的话,那么线程就会挂起接受事件消息,只有关闭窗体以后,才会执行Thread.Sleep,这样就无法满足你定时关闭的功能了,必须手动关闭,所以,改变下思路吧,通过其他方式是实现或者Timer,当时间到了以后,手动关闭窗体
------解决方案--------------------
引用:
Quote: 引用:

你是不是在线程中是不是这样操作的:

            Form2 f = new Form2();
            f.Show();
            Thread.Sleep(5000);

这样的话,是会导致界面等待的,因为你让线程Sleep了,而且窗体的关闭是因为Thead执行完成,资源释放而关闭的,f.Show()执行完成后,窗体不会等待,而是直接执行Thread.Sleep,而如果是ShowDialog的话,那么线程就会挂起接受事件消息,只有关闭窗体以后,才会执行Thread.Sleep,这样就无法满足你定时关闭的功能了,必须手动关闭,所以,改变下思路吧,通过其他方式是实现或者Timer,当时间到了以后,手动关闭窗体



 Func f = new Func(ShowWindow);
            Thread thread = new Thread(new ThreadStart(f));
            thread.IsBackground = true ;
            thread.Start();

private void ShowWindow()

   Form m = new Form();
   m.Show()


//显示窗体的代码
private void Show()
{
ShowOn()
Thread.Sleep(3000);
ShowOff();
}



代码简化起来是这样的

看你的代码,简化了以后跟上面那个差不多,也就是说,你在Show窗体以后,将线程Sleep了,导致你的界面无法响应
------解决方案--------------------

------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

你是不是在线程中是不是这样操作的:

            Form2 f = new Form2();
            f.Show();
            Thread.Sleep(5000);

这样的话,是会导致界面等待的,因为你让线程Sleep了,而且窗体的关闭是因为Thead执行完成,资源释放而关闭的,f.Show()