代码结构如下:
线程函数:
UINT ThreadPro(LPVOID pParam)

  while(1)
     {
        ...;
        if(完成现实任务)  //等待下一个分配任务
        {
          sleep(600000); //睡眠10m
        }
     }
}
主函数:
...
   //产生线程
    for(int i=0;i<5;i++)
    {
      AfxBeginThread(ThreadPro,(LPVOID)mpara);   
    }
...
请问,线程中的sleep怎么对大家都起效啊?第一个线程进入if以后,sleep了,后面的线程怎么都不工作了?求助!

解决方案 »

  1.   

    后面的线程要不也sleep了
    要在在while里使命的运行了
      

  2.   

    while(1) //防止线程完成任务退出的
    我就是用了一个循环,采用了相同的线程函数,然后线程函数里有一个判断,只是对完成工作的线程起效,但是现在好像不是.现象是第一个线程完成任务了,执行sleep,然后就没有音了,就是把后面的线程也阻止了,调试时发现后面的线程是产生了,但是就是不执行线程代码.
      

  3.   

    我的本意是只让完成任务的线程sleep,而没有完成任务的线程继续执行if语句上面的代码.
      

  4.   

    AfxBeginThread(ThreadPro,(LPVOID)mpara);  
    所有的线程都在操作mpara这个的内容,需要同步的
      

  5.   


    你启的线程都是ThreadPro,ThreadPro里面有sleep,当然每个都会sleep啊。
      

  6.   

    没有设置线程优先级,默认的,什么等待函数?等待执行的就一个sleep(600000)不是全局变量的判断,是一个线程函数的局部变量,因此,一个线程的局部变量是不会影响另一个线程的
      

  7.   

    有一个判断,if(...),应该只有满足条件的线程才会执行sleep啊
      

  8.   

    你是怎么确定所有线程都不工作的?可以在代码中插入一些MessageBox或者输出调试信息,确定线程是否在执行。
      

  9.   

      while(1)
    {
    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,我就会知道了
      

  10.   

    这是源代码,在Sleep(300000);////就停止了,感觉整个进程sleep了一样
      

  11.   

    但是把while(1) 和sleep去掉就没有问题,运行正常,但是那样线程就会退出,我不希望线程退出,希望它循环下去
      

  12.   

    如果一个文件夹里面没有文件了,那么对应的线程空耗着也没有什么意思,就sleep了,但是不希望所有的线程sleep啊
      

  13.   

    这样处理显然不好.你可以做个定时器,每隔一段时间检查文件夹是否为空.
    线程可以退出,需要时再启动.
    或者线程WaitForSingleObject()
      

  14.   

    代码比较乱,
    在if(!res) 的地方变为ReleaseMutex(hMutex);
    if(!res) 看看CreateMutex的帮助,然后要保证在每个分支都要执行ReleaseMutex(hMutex);
      

  15.   

    查找句柄就是FindFirstFile返回的HANDLE值。如果用CFileFind类来查找,就是定义一个CFileFind类对象,让所有线程共用。
      

  16.   

    结贴了,hMutex有一个分支没有释放,添加了一个else段,解决!
      

  17.   


     stonewater  ,对不起,给错人了,我是按照你的思路找到问题的!!sorry,30分原本是给你的