我的程序实现了。但是我总觉得运行结果和我预期的不太一样。
我的主对话框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操作一样?有什么函数可以实现吗?
那我是不是应该把现在写在新建线程里的代码放到主线程中处理?或者用别的处理方式?能否给出详细的解决方案?
追答是说要可以及时响应界面的更新么?这样就应该把耗费时间的运算过程从主线程移出来,放到工作线程里,让主线程能够及时执行绘制界面的过程。
追问如何在新建线程中获得主线程窗口对象的成员变量。CTestDlg * pWnd=(CTestDlg *)CWnd::FromHandle(AfxGetMainWnd()->m_hWnd);这个做不到。没办法获取成员变量。
追答应该是可以的啊,要不你把窗口指针作为线程入口函数的参数传给新线程试试。