为了表示清楚我要问的问题, 先看下面的一段代码:
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), 这种区别会很明显)
DoEvents只是让你的界面不卡着的感觉
多线程可以做的事情更多, 例如: 子线程单独处理一件事情, 子线程更新UI 等等
如果在代码中调用 DoEvents,则您的应用程序可以处理其他事件。DoEvents将负责重绘窗体,使程序界面不被卡住。
但DoEvents 方法不调用 Thread.Sleep 方法。不会影响Thread的执行顺序。
我也关注中,等待大虾详解
DoEvents和多线程是两个不同层次的概念。
DoEvents时会查询windows当前的消息队列,优先执行其他消息,比如WM_paint绘制界面等,直至系统空闲时再继续执行,他只在自己的线程中起作用。
多线程线程间的同步本来就是很麻烦的事情。