.NET Compact Framework 线程与界面上的控件

要实现这样的功能:

    点击加载,跳出一个加载进度窗体,窗体上面的进度条在不停的动,加载完毕后,本窗体自动关闭。

    很容易联想到启用一个分线程,启动进度窗体,加载完毕后,我在主线程中想手动关闭 prg.close(),得到的结果是错误,线程访问了非法资源。

    其实在桌面.net framework和.net cf都不支持让用户界面不属于的线程访问他们的大多数属性和方法。虽然代码可以编译执行,但结果将不可预测。为了允许在线程间互相调用,他们提供了一个Control.Invoke()的方法。

  在后台线程和用户界面线程之间通信数据的一个合理和简单的方法就是在用户界面线程上运行代码周期性地轮询你专门设计的管理后台线程的对象,了解是否有用户界面需要的数据。通常这样做要比深入研究交叉线程调用方法的复杂特征容易的多。

   第二种方法是使用一个指向你应用窗口上函数的回调代理。在你的窗口类中一个函数能指定并且这个函数能通过窗口Invoke()方法调用。对Invoke()的调用将使函数在用户界面线程中执行。这样这个就可以获得它需要的任何数据并且同步更写用户界面。这个方法的好处是前台线程并不需要轮询并且在后台线程工作完成时可以马上接受更新。

posted @ 2008-03-04 18:19 cppguy 阅读(286) 评论(5)  编辑 收藏 所属分类: 移动开发

  回复  引用  查看    
#1楼 2008-03-04 19:59 | fox23      
就是delegate
  回复  引用  查看    
#2楼 2008-03-04 20:28 | appleseeker      
用delegate或者多线程都行。

“点击加载,跳出一个加载进度窗体,窗体上面的进度条在不停的动,加载完毕后,本窗体自动关闭。”

主窗体如果在主线程的话,不能关闭,只能最小化。
或者由主线程调用该窗体,通过p/invoke来调用另一个窗体,自己关闭的方式运行。
  回复  引用  查看    
#3楼 2008-03-05 12:43 | fox23      
@appleseeker
delegate本质上就是多线程,只不过把请求投到内核中,在线程池中申请线程。
PS:这个跟p/invoke有什么关系。。。。
  回复  引用  查看    
#4楼 2008-04-05 17:40 | 如影如风      
如果是主窗体有一个进度条在移动,子窗体也有一个进度条同时在移动。这种情况下用invoke也不行。

除了用timer控件控制以外,还能有什么别的办法吗?
  回复  引用  查看    
#5楼 2008-07-16 10:23 | hoodlum1980      
其实在桌面.net framework和.net cf都不支持让用户界面不属于的线程访问他们的大多数属性和方法。

---------------------------------------------------------

很显然的事。。。。。如果访问和修改一个其他线程创建的控件的属性就会导致线程间的死锁。所以才有了BeginInvoke这种方法来帮助你完成这种需要。

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
 
另存  打印