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

2016-01-29 12:35 6 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 }

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

延伸阅读
注意:在2000年9月我们修改了这篇文章和它的例子以适用于一个更新版本的SwingWorker类。SwingWorker类的这个版本修正了一些微妙的线程bug。 Swing API的设计目标是强大、灵活和易用。特别地,我们希望能让程序员们方便地建立新的Swing组件,不论是从头开始还是通过扩展我们所提供的一些组件。 出于这个目的,我们不要求Swing组件...
标签: Delphi
  11.1 Help文件的建立 Help文件是 Micosoft Windows3.0 以上的版本提供的超文本帮助文件。利用这种超文本 , 用户可非常方便地使用帮助文件系统。帮助文件是以主题为主线进行编写的,一个主题可以跳转至相关的主题,也可按关键字进行主题查询。帮助文件与软件开发工具相结合,可实现应用程序的 ' 上下文敏感 ' ,而且帮助系统...
《新·光神话》刷武器的一点心得 最近这几天一直在刷好的武器,每一关都打过好几遍,最后来谈谈一点心得。 就个人最后的得出的结论来说,刷好武器的最好关卡是第20关!接下来就来分析一下原因和大家分享。 首先,要刷好一点的武器的话,关卡越是后面价值越高,就像第一关来说,9级难度刷到爆了也不过260的一把狗头炮而已。于是我便把目光锁定在...
《闪点行动2》单机任务的一点心得 闪点行动2的题材不怎么好,但是感觉游戏作战上面还有它的独到之处。关键是每个任务的可操作性、自由度非常高。但是没有一些评分标准这是比较缺憾的地方。 在斩首行动那关。不知道别人是怎么撤出的。我是呼叫空军炸了雷达站和将军后,然后爬到那两架直升机经过的山顶,用M82A1狙击枪把他们都打下来,结...
  有些时候,我们需要在一个应用程序中打开另外的应用程序,我这几天就做了这样的事,总结了一些东西,希望可以跟大家一起分享和交流一下。其中有可能有一些东西是错误的或者走了弯路,恳请大家能够给我提意见!另外我这些天一直在学习多线程与多进程,期待找到一些共同进步的人!     闲话少说了,还是回答主题上面来。要在应...

经验教程

321

收藏

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