几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量  


返回   几何尺寸与公差论坛------致力于产品几何量公差标准GD&T (GDT:ASME)|New GPS(ISO)研究/CAD设计/CAM加工/CMM测量 » 仿射空间:CAX软件开发(三)二次开发与程序设计 » 程序设计 » C#
用户名
密码
注册 帮助 会员 日历 银行 搜索 今日新帖 标记论坛为已读


回复
 
主题工具 搜索本主题 显示模式
旧 2011-07-05, 09:12 PM   #1
huangyhg
超级版主
 
huangyhg的头像
 
注册日期: 04-03
帖子: 18592
精华: 36
现金: 249466 标准币
资产: 1080358888 标准币
huangyhg 向着好的方向发展
默认 【转帖】wpf多线程的一种解决方案

http://www.haogongju.net/art/17932
最近使用WPF来构建桌面程序,其中要求是:


1. 界面与后台程序使用不同线程,以便在后台运行耗时计算时界面依然响应。

2. 后台程序需要控制界面某些元素,如显示和修改值。

3. 后台程序执行中,需要获取界面把某些用户输入,如用户输出某字符串来继续执行。




然后开始设计,编码测试,过程如下:

对于第1个要求,根据以前的编程经验(Qt,GTK...),果断使用System.Threading.Thread来Start一个线程,与WPF界面线程分开,嗯。

对于第2个要求,使用DataBinding,把WPF界面的类的DataContext设置成给线程用的类里,绑定值,就很容易做到在第二个线程修改值直接反应到WPF的界面上。但对于切换界面(如修改MainWindow的Content给另外一个UserControl),搞得非常麻烦。想过通过绑定Visibility属性,添加IsVisibilityChange方法来做,效果都非常差。从MSDN看WPF多线程的例子http://msdn.microsoft.com/en-us/lib...改WPF的元素了。


接着第3个要求,考虑到.Net有ManualResetEvent(或者AutoResetEvent)这个很方便的类,果断写下这个UserInput类(暂时使用string来作为用户输入的表现)。

然后在后台线程调用WaitInput,这下麻烦出来了,WPF界面线程也一起Block掉了。

于是不停的修改代码,尝试网上搜索到的方法,均不能解决。 然后回头再仔细看MSDN关于WPF多线程的例子,每一个字都认真的读,发现Dispatcher是唯一的多线程可以修改WPF元素的类。那不知道我在另 外一个线程来调用Dispatcher.BeginInvoke来修改WPF元素可否?立即编写代码尝试。结果是可行的。最终程序结构如下:

整个程序只有一个Window类,那就是从Window派生出来的MainWindow。定义若干UserControl与之相关的Presenter类(用于数据绑定和界面切换),并在MainWindow构造函 数里一一生成并绑定,所有的Presenter有Dispatcher属性,所有的Presenter有若干delegate用于数据绑定不能实现的操作 (定义一个基类即可),如更改MainWindow的Content,并在各个UserControl里定义相应的函数,赋于这些delegate,在 Presenter调用这些delegate的时候,使用Dispatcher.BeginInvoke来调用。初始Content为某一 UserControl。使用BackgroundWorker来启动后台线程,定义一个带ManualResetEvent的UserInput来给线 程得到WPF输入。


这个后台线程就可以随时得到用户的输入,如用户想切换到某个特定界面, 后台线程得到这个输入后可以很方便的切换界面。
__________________
借用达朗贝尔的名言:前进吧,你会得到信心!
[url="http://www.dimcax.com"]几何尺寸与公差标准[/url]
huangyhg离线中   回复时引用此帖
GDT自动化论坛(仅游客可见)
回复


主题工具 搜索本主题
搜索本主题:

高级搜索
显示模式

发帖规则
不可以发表新主题
不可以回复主题
不可以上传附件
不可以编辑您的帖子

vB 代码开启
[IMG]代码开启
HTML代码关闭



所有的时间均为北京时间。 现在的时间是 01:57 PM.


于2004年创办,几何尺寸与公差论坛"致力于产品几何量公差标准GD&T | GPS研究/CAD设计/CAM加工/CMM测量"。免责声明:论坛严禁发布色情反动言论及有关违反国家法律法规内容!情节严重者提供其IP,并配合相关部门进行严厉查处,若內容有涉及侵权,请立即联系我们QQ:44671734。注:此论坛须管理员验证方可发帖。
沪ICP备06057009号-2
更多