MFC多线程主线程和新建线程执行关系

我的程序实现了。但是我总觉得运行结果和我预期的不太一样。我的主对话框cpp中声明了一个volatileboolm_bRun;然后在按钮的事件响应函数中一开始创建线程hTh... 我的程序实现了。但是我总觉得运行结果和我预期的不太一样。
我的主对话框cpp中声明了一个volatile bool m_bRun;
然后在按钮的事件响应函数中一开始创建线程
hThread=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ProgressCircle,NULL,0,&ThreadID);

接着是主进程的事件处理代码................
主进程处理完毕后令m_bRun=false;
进程的代码:
void ProgressCircle()
{
m_bRun=true;
while(m_bRun)
{
......具体功能代码。
}
}
为什么我运行以后总感觉两个不是并行的。我老是觉得那个新创建的线程是等主进程做完了再做的。假设我的线程的功能代码是随机改变某个按钮显示的数字,运行以后给人的感觉就是主进程先运行,主进程的那个函数都执行结束了,然后突然那个按钮的数字发生了一连串的变化然后结束了。怎么会这样?
我大概知道是什么原因了。我在子进程内部用了sleep函数,我想请问如何能使进程运行的时候不被打断,就像PV操作一样?有什么函数可以实现吗?
展开
 我来答
poseidon_k
2012-11-22 · TA获得超过2580个赞
知道小有建树答主
回答量:1223
采纳率:0%
帮助的人:303万
展开全部
首先强调一点:你这里有主线程和和新建线程,它们都存在于你这个程序的进程里,这个问题没涉及主进程、子进程什么的,进程和线程的概念千万别弄混。

即使新建线程没用Sleep函数,界面照样不能即时响应新建线程更新界面的操作。Windows的线程可分为UI线程和工作线程,主线程是UI线程,负责一切响应用户输入和绘制窗口界面的人机交互工作,新建的线程是工作线程,只负责运算,不处理人机交互。所以何时响应界面的更新绘制是由你的主线程决定的,如果主线程还在执行某个函数而没有回到消息循环,就不能更新界面,啥时候那个函数执行完了就可以更新界面了。

防止线程被打断,是线程同步问题,与这里的问题没啥关系。Windows提供了一系列的线程同步API,你可以使用像自旋锁、临界区、Slim读写锁、条件变量这样的用户级线程同步API,也可以使用事件、信号量、互斥量这样的内核同步对象。具体的原理和使用方法不是三言两语能说清楚的,你可以阅读操作系统教材和《Windows核心编程》中讲解多线程的章节。
更多追问追答
追问
那我是不是应该把现在写在新建线程里的代码放到主线程中处理?或者用别的处理方式?能否给出详细的解决方案?
追答
是说要可以及时响应界面的更新么?这样就应该把耗费时间的运算过程从主线程移出来,放到工作线程里,让主线程能够及时执行绘制界面的过程。
wxh1983316
2012-11-23 · 超过42用户采纳过TA的回答
知道答主
回答量:194
采纳率:100%
帮助的人:99.9万
展开全部
这个问题我回答不了你,但是你可以去看孙鑫VC++视频的第16课,讲的就是线程同步问题,可以很好解决你的问题。呵呵。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式