首页 新闻 会员 周边

DoEvents和多线程的区别?

0
悬赏园豆:30 [已关闭问题]

为了表示清楚我要问的问题, 先看下面的一段代码:

Form上有两个Button, btnStart, btnStop, 和一个RichTextbox

1 DoEvnets

点击btnStart执行

for(int i =0 ;i < 10, i++)

{

       Thread.Sleep(1000);

       RichTextbox.AppendText(i.ToString());

       Application.DoEvents();
}

2 多线程

点击btnStart

创建一个新的线程newThread

在新线程newThread中执行下面代码

for(int i =0 ;i < 10, i++)

{

       Thread.Sleep(1000);

       RichTextbox.AppendText(i.ToString()); //注意, 为RichTextbox.AppendText赋值只能在主线程中, 我们这里不讨论这个问题, 为了简化问题, 先这么写, 大家明白意思就行
}

我们现在来看一下, 使用DoEvents, 多线程, CPU的执行顺序

1 DoEvents

CPU.MainThread.Sleep(1000)

CPU.MainThread.ShowRichText

......

.....

CPU.MainThread.Sleep(1000)

CPU.MainThread.ShowRichText

2 多线程

CPU.newThread.Sleep(1000)

CPU.MainThread.ShowRichText

......

.....

CPU.newThread.Sleep(1000)

CPU.MainThread.ShowRichText

从上面可以看出,虽然doEvents是一个线程在执行, 多线程是两个线程执行, 但是从CPU的执行上来看,总是

Sleep;

ShowRichText;

.....

Sleep;

ShowRichText;

问题;

1 DoEvents和多线程的本质区别是什么? 要是能给予深刻透彻的解答, 感谢ing...

2 使用DoEvents时,如果已执行btnStart, 当点击btnStop时, 会等待执行完毕Sleep(1000)[当时的],才会响应 ; 但是使用多线程时,却会立马响应, 这是为什么?   (改成sleep(5000), 这种区别会很明显)

问题补充: 不知道下面的比拟是否恰当: CPU: 老师 线程: 学生 1 DoEvents 一个线程: 学生A 老师辅导学生A的语文, 此时DoEvents, 处理消息 老师辅导学生A的数学 2 多线程 两个学生 学生A,学生B 老师辅导学生A的语文, 另外一个线程执行 老师辅导学生B的数学 那么一个老师协助一个学生做两件事情和一个老师协助两个学生分别作两件事情本质上有何不同???? (不管有多少个学生, 老师只有一个, 他必须顺序的一个个处理.)
lcyhjx的主页 lcyhjx | 初学一级 | 园豆:178
提问于:2010-01-17 20:58
< >
分享
其他回答(3)
0

DoEvents只是让你的界面不卡着的感觉

多线程可以做的事情更多, 例如: 子线程单独处理一件事情, 子线程更新UI 等等

风浪 | 园豆:2996 (老鸟四级) | 2010-01-18 09:18
0

如果在代码中调用 DoEvents,则您的应用程序可以处理其他事件。DoEvents将负责重绘窗体,使程序界面不被卡住。

DoEvents 方法不调用 Thread.Sleep 方法。不会影响Thread的执行顺序。

邀月 | 园豆:25475 (高人七级) | 2010-01-18 10:16
0

我也关注中,等待大虾详解

persialee | 园豆:3217 (老鸟四级) | 2010-01-18 10:20
0

DoEvents和多线程是两个不同层次的概念。

DoEvents时会查询windows当前的消息队列,优先执行其他消息,比如WM_paint绘制界面等,直至系统空闲时再继续执行,他只在自己的线程中起作用。

多线程线程间的同步本来就是很麻烦的事情。

风海迷沙 | 园豆:4453 (老鸟四级) | 2010-01-18 10:58
"DoEvents和多线程是两个不同层次的概念" 这个我同意, 但是我对此的理解总是似懂非懂, 不知能否解答的更详细些. 另外请你看一下我的问题补充, 指正一下我的理解偏差在哪里? 谢谢
支持(0) 反对(0) lcyhjx | 园豆:178 (初学一级) | 2010-01-18 22:49
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册