AnimateWindow 阻塞当前线程问题
今天查了蛮多的,虽然不是系统的学习,收获也不小。下面说一下我的解决方法:
问题一:采用 AnimateWindow API实现消息窗体FormMsg的动画出现,但由于该方法会阻塞当前线程,造成其他窗体(主窗体FormMain)的界面假死现象。
解决思路:既然这个动画效果会阻塞当前线程,那我新建一个线程去显示这个窗体不就行了,于是我写下如下代码:
Thread t = new Thread(new ThreadStart(ShowForm));
t.Start(); void ShowForm()
{
FormMsg fm = new FormMsg();
fm.Show();
}
结果消息窗体果然是不卡了,但新的问题又出现了,就是消息窗体出来动画一完马上就消失了,原因可想而知是因为新建的线程方法体执行完了之后就自动over了,窗体自然也就被回收了
解决思路2:后来想到下午查问题的时候了解到这个方法 Application.DoEvents(); 该方法的作用是让当前线程休息下,给界面上的操作一个反应的机会。想到这里我又萌生了解决第二个问题的方法,代码如下:
Thread t = new Thread(new ThreadStart(ShowForm));
t.Start(); void ShowForm()
{
FormMsg fm = new FormMsg();
fm.Show();
while (fm.Visible)
{
Application.DoEvents();
}
}
正如我设想的那样,新建的线程一直等我把消息窗体关闭呢,虽然用了无限循环有点损耗资源,但毕竟也算达到了效果
虽然效果达到了,本来做好的点击消息框里的条目直接跳转到对应业务操作界面时却又出现了一个常见的问题: 从不是创建控件“enjoyor_TabPageHead1”的线程访问它,意思就是消息窗体的控制线程无法直接访问主UI线程里面的控件
解决思路3:,这个好解决,使用 this.Invoke() 就可以了
如果有更好的方案,还请路过的大虾不吝指点!
百度到的资料:
http://www.360doc.com/content/10/1119/20/963301_70775588.shtml 深入探讨MFC消息循环和消息埲
http://www.myexception.cn/c-sharp/919109_2.html 窗体里怎么开二个UI线程
http://blog.sina.com.cn/s/blog_5459c700010004y1.html C#中如何判断线程结束
http://www.2cto.com/kf/201112/113681.html c#线程从陌生熟悉
http://hi.baidu.com/dragonnet/item/2627463b195836f7a98428e8 c#线程状态
http://bbs.csdn.net/topics/80058324 c#线程如何释放
AnimateWindow 阻塞当前线程问题的更多相关文章
- C#.NET使用Task,await,async,异步执行控件耗时事件(event),不阻塞UI线程和不跨线程执行UI更新,以及其他方式比较
使用Task,await,async,异步执行事件(event),不阻塞UI线程和不跨线程执行UI更新 使用Task,await,async 的异步模式 去执行事件(event) 解决不阻塞UI线程和 ...
- Qt中运行后台线程不阻塞UI线程的方案
有一个想法,一个客户端,有GUI界面的同时也要向网络服务器发送本地采集的数据,通过网络发送数据的接口是同步阻塞的,需要等待服务器响应数据. 如果不采用后台线程的方案,用主UI线程关联一个定时器QTim ...
- 关于ViewPager设置属性页setCurrentItem会阻塞主线程ANR总结
关于android开发设置View Pager的直接跳转页set CurrentItem会阻塞主线程ANR. 根据网上解决的说法,分析源码: if (mFirstLayout) { // We don ...
- Python并发编程系列之常用概念剖析:并行 串行 并发 同步 异步 阻塞 非阻塞 进程 线程 协程
1 引言 并发.并行.串行.同步.异步.阻塞.非阻塞.进程.线程.协程是并发编程中的常见概念,相似却也有却不尽相同,令人头痛,这一篇博文中我们来区分一下这些概念. 2 并发与并行 在解释并发与并行之前 ...
- 千万别在UI线程上调用Control.Invoke和Control.BeginInvoke,因为这些是依然阻塞UI线程的,造成界面的假死
原文地址:https://www.cnblogs.com/wangchuang/archive/2013/02/20/2918858.html .c# Invoke和BeginInvoke 区别 Co ...
- Kafka producer异步发送在某些情况会阻塞主线程,使用时候慎重
最近发现一个Kafka producer异步发送在某些情况会阻塞主线程,后来在排查解决问题过程中发现这可以算是Kafka的一个说明不恰当的地方. 问题说明 在很多场景下我们会使用异步方式来发送Kafk ...
- 在什么情况下,不写notify()或者notifyAll()就能唤醒被wait()阻塞的线程?
之前再看java关于线程的某视频时,发现在JDK源码中,join()=join(0)=wait()=wait(0),但是视频中在join()了之后,并没有用notify()或者notifyAll()去 ...
- Java 中你怎样唤醒一个阻塞的线程?
在 Java 发展史上曾经使用 suspend().resume()方法对于线程进行阻塞唤醒,但 随之出现很多问题,比较典型的还是死锁问题. 解决方案可以使用以对象为目标的阻塞,即利用 Object ...
- GJM : 中断被Socket.Accept阻塞的线程
原帖地址:http://blog.csdn.net/kingfox/article/details/7233350 原文作者:狐帝 刚刚学习C#,在编写一个网络通讯的程序的时候,遇到了点麻烦.监听代码 ...
随机推荐
- 核心概念 —— 门面(Facades)
1.简介 门面为应用的服务容器中的绑定类提供了一个"静态"接口.Laravel 内置了很多门面,你可能在不知道的情况下正在使用它们.Laravel 的门面作为服务容器中的底层类的& ...
- http keepalive
转载自: http://www.92csz.com/17/1152.html http keepalive 在http早期 ,每个http请求都要求打开一个tpc socket连接,并且使用一次之后就 ...
- 利用jQuery实现选项卡
/*Tab 选项卡 标签*/ $(function(){ var $div_li =$("div.tab_menu ul li"); $div_li.click(function( ...
- 关于蓝牙设备与ios连接后,自动打开一个app
How to launch an iphone app when an external accessory is either paired over BT or plugged into dock ...
- batch 数字进制的问题
when set viable to number type in cmdexample: set /a num=0833echo %num% display: Invalid number. Nu ...
- Windows Kernel Way 扉言
七年寒窗,但求一道. 笔者在学习windows/linux以及各类编程语言.框架之初因摸不到门路而磕磕绊绊,因寻不到明师而步履蹒跚,或不知缘从何起,或不知路在何处,只能尝试.回溯.重来.反反复复,竟也 ...
- 使用 EF Power Tool Code Frist 生成 Mysql 实体
原文:使用 EF Power Tool Code Frist 生成 Mysql 实体 1,在要生成的项目上右键 2, 3, 4, 5, 生成后的效果 已知问题: 1,在Mys ...
- 《C++ Qt 设计模式》8|15拼图 小游戏的简单实现。拜托,别乱点!
第零章:介绍 看到这个游戏了,感觉蛮好玩的,实现了一下. 界面如下: 游戏玩法:在3×*3的矩阵中,每个按钮都可以点击,如果按钮四周有一个是空白,则点击此按钮则会移动到这个空白.按钮字母顺序变成“AB ...
- 0-1背包问题与N皇后问题的纠结
昨日同学要我帮他看一道算法,如下: 是不是乍一看是“0-1背包”问题呀,我也这么想,于是就这么兴致勃勃的开始用这个想法去思考怎么算.但是算法也忘得差不多,回去赶紧补补,也趁着这次机会好好复习一下算法, ...
- linux 运维知识体系
这里将会介绍一下,LINUX运维工程师的知识体系. 只能说是个人理解吧.并不是必要或者充分的,仅供网友参考. 大部分本博客都有涉及,并不完整. 1.LINUX运维基础 1.1.LINUX系统的简介,分 ...