如何让5个线程依次进行~~~求大神指导,不胜感激~呜呜
本人在MFC对话框中设置了5个按钮,每个按钮对应一个计算方式,
假如长时间计算,会出现像“死机的”状况,但是程序依旧在正常运行,所以我打算给每一个按钮中的内容,做一个线程,这样就不会出现死机的状况。
代码大致形式如下:
UINT yundong(LPVOID lpParam);
UINT pcm(LPVOID lpParam);
UINT AcEnergy(LPVOID lpParam);
UINT Spectral(LPVOID lpParam);
UINT ErrorPower(LPVOID lpParam);
//以上是放在头文件的函数定义
//一下是第一个按钮的线程实现过程
void CStatistics_of_seqDlg::OnButtonPcm()
{
// TODO: Add your control notification handler code here
pThread=AfxBeginThread(pcm,this);
}
UINT pcm(LPVOID lpParam)
{
CStatistics_of_seqDlg *p_pcm=(CStatistics_of_seqDlg *)lpParam;
。。。。
。。。。
}
后面4个按钮依次类推
。。
。。
。。
问题出现了!!!
我依次按顺序点击5个按钮是可以的正常运行的。
但是,我又做了第六个按钮,代表“一键完成”,将上面5个按钮的功能一次性做完。所以我在这个按钮对应的函数中这么写的
//一键完成所有步骤
void CStatistics_of_seqDlg::OnBnClickedButtonErrorKeycomplete()
{
// TODO: 在此添加控件通知处理程序代码
OnButtonPcm();
OnButtonAcEnergy();
OnButtonSpectral();
OnButtonMotionVector();
OnButtonErrorPower();
}
结果就始终报错。
据我猜想,是在我点击“一键完成”按钮时,这5个线程同时开启的,导致了访问空间上的地址冲突。
后来查了一些资料,说WaitForMultipleObjects可以等待函数,请路过的朋友帮忙给了例子,像我这样希望5个按钮做成线程,为了不出现死机的状态,依次完成自己的工程该如何做呀???
[解决办法]
多线程同步。
除了WaitForMultipleObjects,个人感觉你的功能比较简单,设置线程优先级或使用创建暂停的线程方法,然后顺序激活应该也是可以的。
[解决办法]
依次完成的话 用WaitForSingleObject
[解决办法]
依次执行为什么还要做成线程?
线程调度是系统内核决定的,没法依次执行。除非你加一堆锁。创建5个锁,1~5各对应一个。然后6号把所有锁都锁了,然后释放锁1,wait线程1结束,释放锁2,wait线程2结束,依次类推。只不过这么做,完全多次一举。
如果是5个线程访问了一些共享数据,那么数据访问那里加锁。当然,别指望1,2,3,4,5按顺序访问。如果你要按顺序,单线程这是最佳选择。
[解决办法]
DWORD WINAPI DO(){ DWORD dwWait = WaitForMultipleObjects(6 ,pEvents ,FALSE ,INFINITE) ; switch(dwWait) { case YunDong: yundong(Param); break ; case NTPCM: NTpcm() ; break ; case ACENERGY: AcEnergy() ; break ; case SPECTRAL: Spectral() ; break ; case ERRORPOWER: ErrorPower() ; break ; case ALL: yundong(); NTpcm(); AcEnergy(); Spectral(); ErrorPower(); break ; default: break ; }}