我正在使用 Borland C++ (Delphi Forms) 编写一个多线程应用程序。我最近了解到,当我调用 PostThreadMessage() 函数时,我可以在这些类中使用 Windows 的消息服务:
System = new STSystem(SystemName,1000,1,NULL);
while (PostThreadMessage(System->ThreadID,ST_MSG_SYSTEM_INIT,0,0) == 0)
{
Sleep(0);
};
以上似乎工作得很好。问题在于线程执行函数内部此进程的检索端:
void __fastcall STSystem::Execute()
{
ST_Message STMSG;
while(FStatus != Destroyed)
{
FHeartBeat++;
if(GetMessage(MSG,NULL,ST_MSG_SYSTEM_START,ST_MSG_SYSTEM_END))
{
STMSG.Value = MSG->wParam;
if((STMSG.dSYS + (8*STMSG.dSEC) + (64*STMSG.dDEP)) == FSystemID)
{
RXMessages[RxQueueIn++] = STMSG.MSG; // Message
RXMessages[RxQueueIn++] = MSG->lParam; // Data
}
}
if(TaskList->Count>0)
ProcessTask();
if(RxQueueIn!=RxQueueOut)
ProcessRxMessage();
if(TxQueueIn!=TxQueueOut)
ProcessTxMessage();
Sleep(0);
};
}
以上工作大约两个线程周期,然后停止;线程停止,而不是程序。我尝试在 FHeartbeat++ 计数器之后的 IF 子句中使用 PeekMessage() 函数而不是 GetMessage() 函数。这可以防止线程停止但是,仍然找不到在第一个代码块中发送的 INIT 消息。
我希望这个例子不是太具体。我试图留下任何相关的东西。基本上,这是一个没有窗口的类的消息泵。