土法的线程管理,欢迎请大家进来找bug

nuaacims 2005-04-18 11:19:33
Warning Thread负责创建:Msg, Detect, Parse三个线程,同时监控,如果三个线程死亡,负责拉起。
有几个地方不太清楚:
1. 所有的线程都是由TThread继承;
2. WaitForMultiObjects需要传入HANDLE作为参数,但是TThread.Handle是unsigned int,这里使用传
&(TThread.Handle)的方法,能否有效?如果某个线程死亡,WaitForMultiObjects能够返回吗?
3. 这里没有使用TThreadList建立Thread Pool, 应为我觉得似乎没有必要,用我这种方法就可以实现
4. 没有使用TThread.WaitFor()方法


//---------------------------------------------------------------------------
void __fastcall TWarnThread::Execute()
{
//---- Place thread code here ----
try
{
// Start All Thread
if (StartAllThread() < 0)
{
DebugMsg(true, "TWarnThread :: StartAllThread() fail");
return;
}
else
{
DebugMsg(false, "TWarnThread :: StartAllThread() success");
}

/* Monitor thread */
while (!Terminated)
{
DWORD ret;
ret = WaitForMultipleObjects(THREAD_NUM, (void * const *)ThreadHandle, FALSE, 10000);
if ((ret>= WAIT_OBJECT_0) && (ret < WAIT_OBJECT_0 + THREAD_NUM))
{
DebugMsg(true, "TWarnThread :: Detect thread %d terminates. Restart!", ret-WAIT_OBJECT_0);
}

switch (ret - WAIT_OBJECT_0)
{
case 0:
msgThread = new TMsgThread(false);
msgThread->FreeOnTerminate = true;
ThreadHandle[0] = &(msgThread->Handle);
break;
case 1:
parseThread = new TParseThread(false);
parseThread->FreeOnTerminate = true;
ThreadHandle[1] = &(parseThread->Handle);
break;
case 2:
detectThread = new TDetectThread(false);
detectThread->FreeOnTerminate = true;
ThreadHandle[2] = &(detectThread->Handle);
break;
}
}

/* Terminate all Thread */
TerminateAllThread();
}
catch(Exception &E)
{
DebugMsg(true, "TWarnThread :: Execute() Exception %s", E.Message.c_str());
return;
}
}
/*-------------------------------------------------------------------------
* Name : StartAllThread
* Description: Start up threads:
* 1. Msg thread
* 2. Parse thread
*-------------------------------------------------------------------------*/
int __fastcall TWarnThread::StartAllThread()
{
try
{
/* Start up threads */
msgThread = new TMsgThread(false);
parseThread = new TParseThread(false);
detectThread = new TDetectThread(false);

msgThread->m_ASMname = m_ASMname;
parseThread->m_ASMname = m_ASMname;
detectThread->m_ASMname = m_ASMname;

msgThread->FreeOnTerminate = true;
parseThread->FreeOnTerminate = true;
detectThread->FreeOnTerminate = true;

ThreadHandle[0] = &(msgThread->Handle);
ThreadHandle[1] = &(parseThread->Handle);
ThreadHandle[2] = &(detectThread->Handle);
}
catch(Exception &E)
{
DebugMsg(true, "TWarnThread :: Exception %s happen.", E.Message.c_str());
return -1;
}
return 0;
}
/*-------------------------------------------------------------------------
* Name : TerminateAllThread
* Description: Terminate All Thread
*-------------------------------------------------------------------------*/
void __fastcall TWarnThread::TerminateAllThread()
{
try
{
msgThread->Terminate();
delete msgThread;

parseThread->Terminate();
delete parseThread;

detectThread->Terminate();
delete detectThread;

DebugMsg(false, "TWarnThread :: MonitorThread terminating...");
}
catch(Exception &E)
{
DebugMsg(true, "TWarnThread :: Exception %s happen.", E.Message.c_str());
return;
}
}
...全文
78 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
constantine 2005-04-18
  • 打赏
  • 举报
回复
up
3996906 2005-04-18
  • 打赏
  • 举报
回复
up

13,826

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧