代码结构如下:
线程函数:
UINT ThreadPro(LPVOID pParam)
{
while(1)
{
...;
if(完成现实任务) //等待下一个分配任务
{
sleep(600000); //睡眠10m
}
}
}
主函数:
...
//产生线程
for(int i=0;i<5;i++)
{
AfxBeginThread(ThreadPro,(LPVOID)mpara);
}
...
请问,线程中的sleep怎么对大家都起效啊?第一个线程进入if以后,sleep了,后面的线程怎么都不工作了?求助!
线程函数:
UINT ThreadPro(LPVOID pParam)
{
while(1)
{
...;
if(完成现实任务) //等待下一个分配任务
{
sleep(600000); //睡眠10m
}
}
}
主函数:
...
//产生线程
for(int i=0;i<5;i++)
{
AfxBeginThread(ThreadPro,(LPVOID)mpara);
}
...
请问,线程中的sleep怎么对大家都起效啊?第一个线程进入if以后,sleep了,后面的线程怎么都不工作了?求助!
要在在while里使命的运行了
我就是用了一个循环,采用了相同的线程函数,然后线程函数里有一个判断,只是对完成工作的线程起效,但是现在好像不是.现象是第一个线程完成任务了,执行sleep,然后就没有音了,就是把后面的线程也阻止了,调试时发现后面的线程是产生了,但是就是不执行线程代码.
所有的线程都在操作mpara这个的内容,需要同步的
你启的线程都是ThreadPro,ThreadPro里面有sleep,当然每个都会sleep啊。
{
BOOL res = ff.FindFile(sdir);
while(res && !pDlg->m_bEnableExit)
{
hMutex=CreateMutex(NULL,TRUE,"MoveFiles");
WaitForSingleObject(hMutex,INFINITE);
res = ff.FindNextFile();
if(!ff.IsDirectory() && !ff.IsDots()) //文件名,非子目录
{
if(!MoveFileEx(ff.GetFilePath (),ddir+ff.GetFileName (),
MOVEFILE_COPY_ALLOWED |MOVEFILE_WRITE_THROUGH|MOVEFILE_REPLACE_EXISTING))
{
CString sMvRecord;
CTime time;
time=CTime::GetCurrentTime ();
sMvRecord.Format ("erCode:%d"+ff.GetFilePath ()+"<_TO_>"+ddir,GetLastError());
sMvRecord=time.Format ("%H:%M:%S ")+sMvRecord;
if(GetLastError()!=2)
{
HWND hList=GetDlgItem(hwnd,IDC_LIST_ERDOWN);
::SendMessage(hList,LB_ADDSTRING,0,(LPARAM)(LPCSTR)sMvRecord);
nCntSleep=nCntSleep+1;
if(nCntSleep>100)
{
nCntSleep=-1;
Sleep(600000);//sleep for 10 m
}
}
}
else
{
CString sMvRecord;
CTime time;
time=CTime::GetCurrentTime ();
sMvRecord.Format ("success:"+ff.GetFilePath ()+"<_TO_>"+ddir);
sMvRecord=time.Format ("%H:%M:%S ")+sMvRecord;
HWND hList=GetDlgItem(hwnd,IDC_LIST_TODAYINFO);
::SendMessage(hList,LB_INSERTSTRING ,0,(LPARAM)(LPCSTR)sMvRecord);
//hList->Realease();LB_ADDSTRING
ReleaseMutex(hMutex);
ReleaseMutex(hMutex);
Sleep(100);
}
}
}
if(!res)
{
CString sMvRecord;
CTime time;
time=CTime::GetCurrentTime ();
sMvRecord.Format ("完成:"+sdir+"<_TO_>"+ddir);
sMvRecord=time.Format ("%H:%M:%S ")+sMvRecord;
HWND hList=GetDlgItem(hwnd,IDC_LIST_TODAYINFO);
::SendMessage(hList,LB_INSERTSTRING ,0,(LPARAM)(LPCSTR)sMvRecord);
Sleep(300000);////sleep for 300000=5 m
}
//Sleep(1);
}
如果线程运行,那么它会向clistbox输出string,我就会知道了
线程可以退出,需要时再启动.
或者线程WaitForSingleObject()
在if(!res) 的地方变为ReleaseMutex(hMutex);
if(!res) 看看CreateMutex的帮助,然后要保证在每个分支都要执行ReleaseMutex(hMutex);
stonewater ,对不起,给错人了,我是按照你的思路找到问题的!!sorry,30分原本是给你的