首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

怎么让5个线程依次进行~求大神指导,不胜感激~呜呜

2012-04-03 
如何让5个线程依次进行~~~求大神指导,不胜感激~呜呜本人在MFC对话框中设置了5个按钮,每个按钮对应一个计算

如何让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按顺序访问。如果你要按顺序,单线程这是最佳选择。
[解决办法]

探讨
OnButtonPcm();
OnButtonAcEnergy();
OnButtonSpectral();
OnButtonMotionVector();
OnButtonErrorPower();

你这些按钮的执行都是同步的,一个执行完了才会执行下一个,你根本没有创建任何线程,都是在主线程中执行的!

看看怎么创建线程吧!

[解决办法]
探讨

void CStatistics_of_seqDlg::OnBnClickedButtonErrorKeycomplete()
你在这个函数里直接创建5个线程不就好了
如果是要顺序运行线程的用WaitForSingleObject
不要求循序的
直接
pThread1=AfxBeginThread(pcm,this);
pThread2=.....;
pThread3=.....;……

[解决办法]
把前5个按钮对应的操作写成5个函数Fun1、Fun2、Fun3、Fun4、Fun5,再在线程里调用这些函数
DWORD WINAPI Thread1(LPVOID pParam)
{
Fun1();
}
DWORD WINAPI Thread2(LPVOID pParam)
{
Fun2();
}
......
DWORD WINAPI Thread5(LPVOID pParam)
{
Fun5();
}
第6个按钮对应的线程函数中依次调用这5个函数
DWORD WINAPI Thread6(LPVOID pParam)
{
Fun1();
Fun2();
Fun3();
Fun4();
Fun5();
}
void CStatistics_of_seqDlg::OnButton1()
{
// TODO: Add your control notification handler code here
pThread1 = AfxBeginThread(Thread1,this);
}
......
void CStatistics_of_seqDlg::OnButton6()
{
// TODO: Add your control notification handler code here
pThread6 = AfxBeginThread(Thread6,this);
}
[解决办法]
把所有的操作放到一个线程中,WaitFroMultiObject来等待6个事件。
C/C++ code
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 ;    }} 

热点排行