现在点击按钮的时候,另起了一个线程处理提示窗口的显示,在显示提示窗口和消失提示窗口之间用了Thread.sleep()函数来控制显示时间。
在显示的过程中,提示窗体是卡死状态,也就是鼠标移到窗体上的时候是显示等待的状态。但是不把显示提示窗体的功能放在线程中就不会出现这种情况,求教大家了。
19 个解决方案
#1
有没有用到Control.Invoke,有没有在这个委托中包含能让线程挂起的代码。
#2
你是不是在线程中是不是这样操作的:
这样的话,是会导致界面等待的,因为你让线程Sleep了,而且窗体的关闭是因为Thead执行完成,资源释放而关闭的,f.Show()执行完成后,窗体不会等待,而是直接执行Thread.Sleep,而如果是ShowDialog的话,那么线程就会挂起接受事件消息,只有关闭窗体以后,才会执行Thread.Sleep,这样就无法满足你定时关闭的功能了,必须手动关闭,所以,改变下思路吧,通过其他方式是实现或者Timer,当时间到了以后,手动关闭窗体
Form2 f = new Form2();
f.Show();
Thread.Sleep(5000);
这样的话,是会导致界面等待的,因为你让线程Sleep了,而且窗体的关闭是因为Thead执行完成,资源释放而关闭的,f.Show()执行完成后,窗体不会等待,而是直接执行Thread.Sleep,而如果是ShowDialog的话,那么线程就会挂起接受事件消息,只有关闭窗体以后,才会执行Thread.Sleep,这样就无法满足你定时关闭的功能了,必须手动关闭,所以,改变下思路吧,通过其他方式是实现或者Timer,当时间到了以后,手动关闭窗体
#3
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();
}
代码简化起来是这样的
#4
没有,,能给个示例代码看看不
#5
自己顶一下。。。。
#6
看你的代码,简化了以后跟上面那个差不多,也就是说,你在Show窗体以后,将线程Sleep了,导致你的界面无法响应
#7
你是不是在线程中是不是这样操作的:
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,而不采用线程的情况下,是不会卡死的
#8
#9
你是不是在线程中是不是这样操作的:
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冲突了~
#10
你是不是在线程中是不是这样操作的:
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冲突了~
没用。。。
#11
不知道你的代码要干嘛。
想控制显示一段时间然后关闭,要用timer。如果用线程,那就不要在线程里show窗口,而是ui显示窗口后开启线程,线程sleep()之后,通过委托或者事件通知ui关闭窗口。
想控制显示一段时间然后关闭,要用timer。如果用线程,那就不要在线程里show窗口,而是ui显示窗口后开启线程,线程sleep()之后,通过委托或者事件通知ui关闭窗口。
#12
不知道你的代码要干嘛。
想控制显示一段时间然后关闭,要用timer。如果用线程,那就不要在线程里show窗口,而是ui显示窗口后开启线程,线程sleep()之后,通过委托或者事件通知ui关闭窗口。
提示窗体的功能是为了展示从服务端发来的信息,这里面是用socket和服务端通信的,所以放在线程里面,线程里面监听服务端发来的信息,有信息的话就在右下角展示出来。窗体的显示在线程里面就有卡死的现象
#13
你在要显示的Form m = new Form();窗口中新开一个计时器,1秒钟看一下,到了5秒自动关闭就行了
放在主线程中也可以
放在主线程中也可以
#14
你在要显示的Form m = new Form();窗口中新开一个计时器,1秒钟看一下,到了5秒自动关闭就行了
放在主线程中也可以
这个线程要一直保持连接接收服务端发来的消息的,在线程里面试过计时器,没用。
#15
LZ的整个流程设计修改下吧,有点混乱,
把UI控制和数据监听分开处理吧,数据监听放在新线程里面,而其他UI相关逻辑,由主线程控制吧
把UI控制和数据监听分开处理吧,数据监听放在新线程里面,而其他UI相关逻辑,由主线程控制吧
#16
功能是:主窗体上有一个按钮,点击之后在桌面的右下角显示一个提示窗口。
现在点击按钮的时候,另起了一个线程处理提示窗口的显示,在显示提示窗口和消失提示窗口之间用了Thread.sleep()函数来控制显示时间。
在显示的过程中,提示窗体是卡死状态,也就是鼠标移到窗体上的时候是显示等待的状态。但是不把显示提示窗体的功能放在线程中就不会出现这种情况,求教大家了。
楼主有么有知道解决的方法
#17
不知道你的代码要干嘛。
想控制显示一段时间然后关闭,要用timer。如果用线程,那就不要在线程里show窗口,而是ui显示窗口后开启线程,线程sleep()之后,通过委托或者事件通知ui关闭窗口。
提示窗体的功能是为了展示从服务端发来的信息,这里面是用socket和服务端通信的,所以放在线程里面,线程里面监听服务端发来的信息,有信息的话就在右下角展示出来。窗体的显示在线程里面就有卡死的现象
在你自己弹出的form里放个timer到时间关自己就行了。这功能和线程一毛钱关系都没有。
#18
不知道你的代码要干嘛。
想控制显示一段时间然后关闭,要用timer。如果用线程,那就不要在线程里show窗口,而是ui显示窗口后开启线程,线程sleep()之后,通过委托或者事件通知ui关闭窗口。
提示窗体的功能是为了展示从服务端发来的信息,这里面是用socket和服务端通信的,所以放在线程里面,线程里面监听服务端发来的信息,有信息的话就在右下角展示出来。窗体的显示在线程里面就有卡死的现象
在你自己弹出的form里放个timer到时间关自己就行了。这功能和线程一毛钱关系都没有。
试过timer,时间到了不会执行设置好的事件函数,不把显示form的代码放在线程里面,timer就可以有效
#19
不知道你的代码要干嘛。
想控制显示一段时间然后关闭,要用timer。如果用线程,那就不要在线程里show窗口,而是ui显示窗口后开启线程,线程sleep()之后,通过委托或者事件通知ui关闭窗口。
提示窗体的功能是为了展示从服务端发来的信息,这里面是用socket和服务端通信的,所以放在线程里面,线程里面监听服务端发来的信息,有信息的话就在右下角展示出来。窗体的显示在线程里面就有卡死的现象
在你自己弹出的form里放个timer到时间关自己就行了。这功能和线程一毛钱关系都没有。
试过timer,时间到了不会执行设置好的事件函数,不把显示form的代码放在线程里面,timer就可以有效
你试试用 System.Timers.Timer
#20
#1
有没有用到Control.Invoke,有没有在这个委托中包含能让线程挂起的代码。
#2
你是不是在线程中是不是这样操作的:
这样的话,是会导致界面等待的,因为你让线程Sleep了,而且窗体的关闭是因为Thead执行完成,资源释放而关闭的,f.Show()执行完成后,窗体不会等待,而是直接执行Thread.Sleep,而如果是ShowDialog的话,那么线程就会挂起接受事件消息,只有关闭窗体以后,才会执行Thread.Sleep,这样就无法满足你定时关闭的功能了,必须手动关闭,所以,改变下思路吧,通过其他方式是实现或者Timer,当时间到了以后,手动关闭窗体
Form2 f = new Form2();
f.Show();
Thread.Sleep(5000);
这样的话,是会导致界面等待的,因为你让线程Sleep了,而且窗体的关闭是因为Thead执行完成,资源释放而关闭的,f.Show()执行完成后,窗体不会等待,而是直接执行Thread.Sleep,而如果是ShowDialog的话,那么线程就会挂起接受事件消息,只有关闭窗体以后,才会执行Thread.Sleep,这样就无法满足你定时关闭的功能了,必须手动关闭,所以,改变下思路吧,通过其他方式是实现或者Timer,当时间到了以后,手动关闭窗体
#3
你是不是在线程中是不是这样操作的:
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();
}
代码简化起来是这样的
#4
有没有用到Control.Invoke,有没有在这个委托中包含能让线程挂起的代码。
没有,,能给个示例代码看看不
#5
自己顶一下。。。。
#6
你是不是在线程中是不是这样操作的:
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了,导致你的界面无法响应
#7
你是不是在线程中是不是这样操作的:
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,而不采用线程的情况下,是不会卡死的
#8
#9
你是不是在线程中是不是这样操作的:
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冲突了~
#10
你是不是在线程中是不是这样操作的:
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冲突了~
没用。。。
#11
不知道你的代码要干嘛。
想控制显示一段时间然后关闭,要用timer。如果用线程,那就不要在线程里show窗口,而是ui显示窗口后开启线程,线程sleep()之后,通过委托或者事件通知ui关闭窗口。
想控制显示一段时间然后关闭,要用timer。如果用线程,那就不要在线程里show窗口,而是ui显示窗口后开启线程,线程sleep()之后,通过委托或者事件通知ui关闭窗口。
#12
不知道你的代码要干嘛。
想控制显示一段时间然后关闭,要用timer。如果用线程,那就不要在线程里show窗口,而是ui显示窗口后开启线程,线程sleep()之后,通过委托或者事件通知ui关闭窗口。
提示窗体的功能是为了展示从服务端发来的信息,这里面是用socket和服务端通信的,所以放在线程里面,线程里面监听服务端发来的信息,有信息的话就在右下角展示出来。窗体的显示在线程里面就有卡死的现象
#13
你在要显示的Form m = new Form();窗口中新开一个计时器,1秒钟看一下,到了5秒自动关闭就行了
放在主线程中也可以
放在主线程中也可以
#14
你在要显示的Form m = new Form();窗口中新开一个计时器,1秒钟看一下,到了5秒自动关闭就行了
放在主线程中也可以
这个线程要一直保持连接接收服务端发来的消息的,在线程里面试过计时器,没用。
#15
LZ的整个流程设计修改下吧,有点混乱,
把UI控制和数据监听分开处理吧,数据监听放在新线程里面,而其他UI相关逻辑,由主线程控制吧
把UI控制和数据监听分开处理吧,数据监听放在新线程里面,而其他UI相关逻辑,由主线程控制吧
#16
功能是:主窗体上有一个按钮,点击之后在桌面的右下角显示一个提示窗口。
现在点击按钮的时候,另起了一个线程处理提示窗口的显示,在显示提示窗口和消失提示窗口之间用了Thread.sleep()函数来控制显示时间。
在显示的过程中,提示窗体是卡死状态,也就是鼠标移到窗体上的时候是显示等待的状态。但是不把显示提示窗体的功能放在线程中就不会出现这种情况,求教大家了。
楼主有么有知道解决的方法
#17
不知道你的代码要干嘛。
想控制显示一段时间然后关闭,要用timer。如果用线程,那就不要在线程里show窗口,而是ui显示窗口后开启线程,线程sleep()之后,通过委托或者事件通知ui关闭窗口。
提示窗体的功能是为了展示从服务端发来的信息,这里面是用socket和服务端通信的,所以放在线程里面,线程里面监听服务端发来的信息,有信息的话就在右下角展示出来。窗体的显示在线程里面就有卡死的现象
在你自己弹出的form里放个timer到时间关自己就行了。这功能和线程一毛钱关系都没有。
#18
不知道你的代码要干嘛。
想控制显示一段时间然后关闭,要用timer。如果用线程,那就不要在线程里show窗口,而是ui显示窗口后开启线程,线程sleep()之后,通过委托或者事件通知ui关闭窗口。
提示窗体的功能是为了展示从服务端发来的信息,这里面是用socket和服务端通信的,所以放在线程里面,线程里面监听服务端发来的信息,有信息的话就在右下角展示出来。窗体的显示在线程里面就有卡死的现象
在你自己弹出的form里放个timer到时间关自己就行了。这功能和线程一毛钱关系都没有。
试过timer,时间到了不会执行设置好的事件函数,不把显示form的代码放在线程里面,timer就可以有效
#19
不知道你的代码要干嘛。
想控制显示一段时间然后关闭,要用timer。如果用线程,那就不要在线程里show窗口,而是ui显示窗口后开启线程,线程sleep()之后,通过委托或者事件通知ui关闭窗口。
提示窗体的功能是为了展示从服务端发来的信息,这里面是用socket和服务端通信的,所以放在线程里面,线程里面监听服务端发来的信息,有信息的话就在右下角展示出来。窗体的显示在线程里面就有卡死的现象
在你自己弹出的form里放个timer到时间关自己就行了。这功能和线程一毛钱关系都没有。
试过timer,时间到了不会执行设置好的事件函数,不把显示form的代码放在线程里面,timer就可以有效
你试试用 System.Timers.Timer