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

我的程序实现了。但是我总觉得运行结果和我预期的不太一样。
我的主对话框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操作一样?有什么函数可以实现吗?

首先强调一点:你这里有主线程和和新建线程,它们都存在于你这个程序的进程里,这个问题没涉及主进程、子进程什么的,进程和线程的概念千万别弄混。

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

防止线程被打断,是线程同步问题,与这里的问题没啥关系。Windows提供了一系列的线程同步API,你可以使用像自旋锁、临界区、Slim读写锁、条件变量这样的用户级线程同步API,也可以使用事件、信号量、互斥量这样的内核同步对象。具体的原理和使用方法不是三言两语能说清楚的,你可以阅读操作系统教材和《Windows核心编程》中讲解多线程的章节。追问

那我是不是应该把现在写在新建线程里的代码放到主线程中处理?或者用别的处理方式?能否给出详细的解决方案?

追答

是说要可以及时响应界面的更新么?这样就应该把耗费时间的运算过程从主线程移出来,放到工作线程里,让主线程能够及时执行绘制界面的过程。

追问

如何在新建线程中获得主线程窗口对象的成员变量。CTestDlg * pWnd=(CTestDlg *)CWnd::FromHandle(AfxGetMainWnd()->m_hWnd);这个做不到。没办法获取成员变量。

追答

应该是可以的啊,要不你把窗口指针作为线程入口函数的参数传给新线程试试。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-11-23
这个问题我回答不了你,但是你可以去看孙鑫VC++视频的第16课,讲的就是线程同步问题,可以很好解决你的问题。呵呵。
相似回答