n个计划任务,时间一到都要启动同一个线程,这个线程中启动一个.bat文件,.bat文件运行时间可能要挺长,于是线程启动的时候就要sleep一个时间段(大概2小时),等待.bat文件运行完返回后解析结果。于是问题出来了,当n个计划任务其中2个任务恰巧同时执行的时候,我发现不能因为线程sleep的特殊性,不可以同时启动2个线程运行(会出现这样的情况:A线程醒来后发现从主线程传来的参数变成B线程的了),所以只能1个1个来。得弄个类似队列得机制!我用启动线程后返回的HANDLE是否为空来判断线程是否执行完毕,z主线程的定时器函数里的代码如下://判断计划任务是否到时间
if(strCurTime == strNodeTime){
if(this->m_pBupMger->m_hDBBackupThread == NULL)//线程是否正在运行
this->m_pBupMger->DBBackup(0);
else{
                           //主线程里不停判断线程是否执行完毕,可是这么以来,主线程就死掉
while(this->m_pBupMger->m_hDBBackupThread != NULL){
};
this->m_pBupMger->DBBackup(0);
}
}我只想弄个队列来一个一个执行线程,又不想主线程会死掉,请高手指点一二,提供建议都有分!!

解决方案 »

  1.   

    更改:我发现不能因为线程sleep的特殊性-》》我发现因为线程sleep的特殊性
      

  2.   

    注意同步,启动线程后应该用WaitForSingleObject等待结果。
      

  3.   

    WaitForSingleObject只是改善了系统的性能,
    不能改变主线程死掉的现象。这时主线程被挂起罢了.
    解决问题的办法是:
    在主线程中产生一个调度线城,调度线程启动工作线程.
    为了提高性能,在调度线程中用使用waitforsingleobject,
    这样对主线程没有影响(不会死掉)。
      

  4.   

    楼上的意思是不是这样的?
    UINT __stdcall AThread(LPVOID pParam)
    {
     //代码
    ::Sleep(120000);
      return 0;
    }UINT __stdcall BThread(LPVOID pParam)
    {
    WaitForSingleObject(AThread ,INFINITE); 
      m_AThread = (HANDLE)_beginthreadex(NULL,
    0,
    AThread,
    (void*)this,
    0,
    &m_dwID);}
    主线程调用 m_BThread = (HANDLE)_beginthreadex(NULL,
    0,
    AThread,
    (void*)this,
    0,
    &m_dwID);是这样的吗?
      

  5.   

    主线程是否可以用各消息循环,用peekmessage收消息,收不到的话还可以做其他事情
      

  6.   

    其他线程结束后就像主线程发消息postthreadmessage
      

  7.   

    子线程用WairForSingObject等待返回,主线程不能用WaitForSingObject(会阻塞主线程),可以让子线程发Message给主线程来通知主线程
      

  8.   

    看看这个方案是否适合你:
    将系统划分为三个功能体:调度体、生产体、消费体
    1、调度体:运行于主线程,基于窗体的消息循环实现,由定时器、接收器、派发器实现,功能有:
    定时器:定时触发创建生产体线程,并维护生产体线程队列
    接收器:接收来自生产体处理完成BAT文件的消息,将其线程标识从生产体线程中删除,并将BAT信息传给派发器
    派发器:接受来自接收器的BAT信息,创建消费体线程,并将其维护进消费体线程队列,消费体线程执行完分析后通知派发器,将该线程标识从消费体线程队列中清除
    必要是,调度体还可以记日志
    2、生产体:运行于工作线程,完成BAT文件处理,任务完成后或未完成都向调度体发送消息,请求必要的清场处理
    3、消费体:运行于工作线程,完成BAT文件分析,任务完成后或未完成都向调度体发送消息,请求必要的清场处理这样做的好处是:
    1、主线程是基于消息循环的,比较安全,不易死锁和死循环
    2、将运行BAT和分析BAT分成两个独立的线程处理,并由主线程负责调度和清场,对于费时的任务运行时机选择比较容易控制和监控
      

  9.   

    To jdzwq(一技之痒) :非常感谢你的建议,不过我觉得你的方案太麻烦了,如果再将“派发器”做成线程队列,或者线程,那程序就很复杂了,这个我暂且不会去想,现在我倒是想出一个简单的方案,不知道是否可行:
    在主线程中维护一个队列,计划任务时间一到启动线程,若发现线程函数正在之行,则将新线程相关信息加入队列,旧线程执行完毕向主线程发送消息,主线程判断队列是否为空,不为空则执行线程函数。
    不过暂时还没想到怎么创建这个队列比较好,判断线程是否正在运行我采取判断线程句柄是否为空方式(在线程结束前将线程句柄置空),没有试过,不知道是否有更好的方案!
      

  10.   

    n个计划任务,时间一到你启动线程(A)再启动一个线程(B,这时让A等待)来执行.bat文件。等(WaitForSingleObject)B执行完成后,A继续执行(解析.bat文件执行后的结果)。