在线程中如何操作Form上的控件
来源:互联网 发布:苹果笔记本安装软件 编辑:程序博客网 时间:2024/05/22 00:41
.NET C#, Application,
这两天在做一个登录界面。
需求:
1。当点击登录按钮后,显示一个进度条,登录按钮上显示的内容变为取消。
2。在收到登录应答后,结束该进度条。
3。在收到登录应答前,用户可以点击取消按钮用来取消登录的动作。
V1.0 最初的设想是登录按钮的Click事件处理中产生一个线程来显示进度条,click事件启动该线程,然后执行登录操作,收到登录的应答后结束控制进度条的线程。进行调试时,报错:不能在线程中操作不是在本线程中创建的控制。
看来此路不通。
V2.0 查看关于Message的帮助,试图通过MessageWindow来发送消息。发现MessageWindow在WindowsCE这个namespace中,于是放弃该思路。
V3.0 在登录界面上增加了一个Timer来控制进度条的显示。在登录按钮的Click事件中启动此Timer,然后调用登录的过程。结果测试时发现进度条永远显示不出来。思索一番后笑自己好傻好天真:因为消息处理是一条一条的处理的,登录按钮的Click事件没有处理完,Windows不会去做别的事情。
V4.0 再试试EventHandler. 将登录的操作放到线程里进行,在Form上增加一个处理登录结束的Event处理方式。在线程取得Server的应答后,该线程调用form的EventHandler。一开始看起来思路是对的,但与V1.0犯了相同的错误:在一个线程中操作另一个线程创建的控件。
V5.0 该怎么办呢?操作控件只能在创建该控件的线程上进行。在CSDN上问了一下,有高手指点查查InvokerRequired的帮助。查到了BeginInvoke,该方法提供了在创建控件的基础句柄所在线程上异步执行指定委托的能力。又在帮助中查到了"如果:使用后台线程搜索文件"这篇文档。
这样,解决方案就出来了。
form
{
- form{
- private EventHandler onLoginThread;
- private void form_Load(..)
- {
- onLoginThread = new EventHandler(login_LoginEvent);
- }
- private void login_LoginEvent(..)
- {
- //stop timer
- //control ProgressBasr
- // some other opertion...
- }
- private void loginButton_Click(..)
- {
- // if do login:
- //begin timer
- //begin login thread
- tl = new Thread(loginThread);
- // else do cancel
- }
- private void loginThread()
- {
- //connect to server
- ...
- BeginInvoke(onLoginThread);
- }
- }
}
- 在线程中如何操作Form上的控件
- 如何在子线程中操作窗体上的控件
- 如何在子线程中操作窗体上的控件
- 如何在子线程中操作窗体上的控件
- 如何在子线程中操作窗体上的控件
- 如何在子线程中操作窗体上的控件
- 如何在子线程中操作窗体上的控件
- 如何在子线程中操作窗体上的控件
- 如何在子线程中操作窗体上的控件 (来自 愚翁专栏)
- 往如何在子线程中操作窗体上的控件
- 如何在子线程中操作窗体上的控件(在做线程,把好资料转载)
- 在子线程中操作窗体上的控件
- 别的不多说先,先记下遇到的问题:如何在子线程中操作窗体上的控件
- 线程中操作窗体上的控件
- 如何让一个Form显示在另外一个Form上的一个控件上
- C#的线程中如何操作控件?
- C#在一个线程中操作另一个线程的控件
- 在一个线程中操作窗体线程的控件
- 开发思考
- 弹出框的优化代码
- ora-01846:周中的日无效
- 人工神经网络 Artificial Neural Networks - A Tutorial
- apache支持ssi
- 在线程中如何操作Form上的控件
- MAPX中修改图元的属性值
- OTL(4.0) Frequently Asked Questions经典问答(2010.4.10更新)
- 明天奥运会就开幕了,中国,加油!
- 如何理解C run-time library
- Windows CE创建桌面快捷方式
- 在ARM9(s3c2410)上移植GUI系统(gtk+ 与 DirectFb)
- 隆重发布.net项目开发工具(V3.0 )
- js获取浏览器高度和宽度值