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);
}
}我只想弄个队列来一个一个执行线程,又不想主线程会死掉,请高手指点一二,提供建议都有分!!
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);
}
}我只想弄个队列来一个一个执行线程,又不想主线程会死掉,请高手指点一二,提供建议都有分!!
解决方案 »
- 急求,月底就要交了!哪位大侠给个vc的指针式时钟,要与电脑时间同步,而且可以调节时间的
- 求车辆跟踪的测试视频,具体要求请看帖子
- 多线程中使用mysql的c api是安全的吗??
- 100分求答,对高手来说非常菜的问题
- 面式VC+数据库(MSSQL) 高分汇总一下。
- 100分,哪有各种病毒的样本文件?
- 使用 CDib 时,如果图片文件比较大,一般4M 左右,有什么办法可以提高文件的读写速度?
- 关于多线程文件传输
- 迷茫中.....给个建议:辞还是不辞
- MFC在基于对话框模式的程序中 菜单选项前打对勾 不能响应 急求???
- __## 在线->立即结贴: struct 里面使用 char 还是 CString定义?---##--
- 急请高手帮忙:如果将一位图,加入一些文字,输出为另一位图?
不能改变主线程死掉的现象。这时主线程被挂起罢了.
解决问题的办法是:
在主线程中产生一个调度线城,调度线程启动工作线程.
为了提高性能,在调度线程中用使用waitforsingleobject,
这样对主线程没有影响(不会死掉)。
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);是这样的吗?
将系统划分为三个功能体:调度体、生产体、消费体
1、调度体:运行于主线程,基于窗体的消息循环实现,由定时器、接收器、派发器实现,功能有:
定时器:定时触发创建生产体线程,并维护生产体线程队列
接收器:接收来自生产体处理完成BAT文件的消息,将其线程标识从生产体线程中删除,并将BAT信息传给派发器
派发器:接受来自接收器的BAT信息,创建消费体线程,并将其维护进消费体线程队列,消费体线程执行完分析后通知派发器,将该线程标识从消费体线程队列中清除
必要是,调度体还可以记日志
2、生产体:运行于工作线程,完成BAT文件处理,任务完成后或未完成都向调度体发送消息,请求必要的清场处理
3、消费体:运行于工作线程,完成BAT文件分析,任务完成后或未完成都向调度体发送消息,请求必要的清场处理这样做的好处是:
1、主线程是基于消息循环的,比较安全,不易死锁和死循环
2、将运行BAT和分析BAT分成两个独立的线程处理,并由主线程负责调度和清场,对于费时的任务运行时机选择比较容易控制和监控
在主线程中维护一个队列,计划任务时间一到启动线程,若发现线程函数正在之行,则将新线程相关信息加入队列,旧线程执行完毕向主线程发送消息,主线程判断队列是否为空,不为空则执行线程函数。
不过暂时还没想到怎么创建这个队列比较好,判断线程是否正在运行我采取判断线程句柄是否为空方式(在线程结束前将线程句柄置空),没有试过,不知道是否有更好的方案!