读书人

在线程中显示窗口卡死解决方案

发布时间: 2013-11-23 10:52:51 作者: rapoo

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

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

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

引用:
Quote: 引用:

Quote: 引用:

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了,导致你的界面无法响应

但是如果
 Func f = new Func(ShowWindow);
Thread thread = new Thread(new ThreadStart(f));
thread.IsBackground = true ;
thread.Start();

这里直接调用ShowWindow,而不采用线程的情况下,是不会卡死的

把你的函数Show改个函数名吧,跟Form自己的Show冲突了~
[解决办法]
不知道你的代码要干嘛。
想控制显示一段时间然后关闭,要用timer。如果用线程,那就不要在线程里show窗口,而是ui显示窗口后开启线程,线程sleep()之后,通过委托或者事件通知ui关闭窗口。
[解决办法]
你在要显示的Form m = new Form();窗口中新开一个计时器,1秒钟看一下,到了5秒自动关闭就行了
放在主线程中也可以
[解决办法]
LZ的整个流程设计修改下吧,有点混乱,
把UI控制和数据监听分开处理吧,数据监听放在新线程里面,而其他UI相关逻辑,由主线程控制吧

读书人网 >C#

热点推荐