多线程应用程序中调用窗体的一点心得

2016-01-29 12:35 9 1 收藏

多线程应用程序中调用窗体的一点心得,多线程应用程序中调用窗体的一点心得

【 tulaoshi.com - ASP.NET 】


昨天自己编写一个多线程的程序,主要作用是TCP通迅的小程序,里面使用了多线程的技术,遇到一个有趣的问题:就是在工作线程中我调用了一个窗体,让它显示出来。如Form1 f=new Form1();f.show();这种代码平时一点问题都没有。但是在工作线程中却无法调过了。我的FORM1在桌面上动弹不得了。什么也不响应。有点象假死机的状态。后来我将Form1 f;这代码放到主线程里去实例化,一切都正常了。(估计是工作线程的原因)
经过查阅MSDN才知道:当程序运行时,我们已经开启了一个线程,UI 线程. 而平时的一般工作,比如说新开窗口啦,按钮事件啦,这都是在UI 线程的管辖之下。而如果我们新建一个线程,当这个线程需要调用一个新窗口的时候,不可以直接在这个新线程之下调用,而是需要让UI 线程去调用新窗口。而新的线程所做的是给UI线程发送一条信息,让它打开窗口。而做这一步,我们就需要用到Delegate 技术。 如果一个控件的处理程序和操作它的代码不在同一线程中,则需要使用 控件名.Invoke 方法代码片断如下://工作线程的代码将直接调用FOrm下定义的FormShow方法ListenerThread(){//这是一个自由线程。不能在这里直接调用一个窗体FormShow();//OK}delegate void FormHandler(DataSet ds);//声明一个委托//定义一个方法此方法用来显示一个窗体private void FormShow(DataSet ds) { if (!this.InvokeRequired) //如果当前线程不是主UI线程,返回true,否则,返回false. { frmBills fb = new frmBills(); fb.Show(); fb.Display(ds); } else { FormHandler fHandler = new FormHandler(this.FormShow); //创建一个新instance指向FormShow. this.Invoke(fHandler, new object[] {ds}); //启动delegate }

来源:http://www.tulaoshi.com/n/20160129/1486713.html

延伸阅读
《闪点行动2》单机任务的一点心得 闪点行动2的题材不怎么好,但是感觉游戏作战上面还有它的独到之处。关键是每个任务的可操作性、自由度非常高。但是没有一些评分标准这是比较缺憾的地方。 在斩首行动那关。不知道别人是怎么撤出的。我是呼叫空军炸了雷达站和将军后,然后爬到那两架直升机经过的山顶,用M82A1狙击枪把他们都打下来,结...
由于API过程存在于VisualBasic应用程序之外的文件中,在使用时必须指定过程的位置和调用参数。可以用Declare语句提供这类信息。在声明了API过程之后,可以把它当做VisualBasic自己的过程使用。 如果在VisualBasic中直接调用API,那么VisualBasic环境下固有的安全机制将受到不利影响。这意味着在测试和调试程序时可能会遇到更多的系统故障...
使用Photoshop制作黑白照片的一点心得 通常,黑白照片比彩色照片更能体现历史感和陈旧感。如果在拍摄的时候没想到调成黑白模式,那么我们可以使用Photoshop将彩色照片转换成黑白照片。转换的方法有很多,下面我们就一张小萝莉照片来探讨下制作黑白照片的一点心得吧! 素材: 大家跟着我的步骤做吧: 复制背景层,并执行...
问题的产生: 我的WinForm程序中有一个用于更新主窗口的工作线程(worker thread),但文档中却提示我不能在多线程中调用这个form(为什么?),而事实上我在调用时程序常常会崩掉。请问如何从多线程中调用form中的方法呢? 解答: 每一个从Control类中派生出来的WinForm类(包括Control类)都是依靠底层Windows消息和一个...
《幽灵行动2》对队友控制的一点心得 会员:mashburn <原创 玩GRAW2的日子也有一些了,感觉游戏对队友的控制虽然要比GRAW要好一些,但还是不太完美(主要还是AI问题),不过玩多了还算是积累下一些心得。 注意:一切的心得都是建立在以下这两个前提下的: 一、游戏的AI的确不太行,主要还是反应慢。但AI问题摆在那里现在是无法改变的,整天...

经验教程

51

收藏

38
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部