我在寫一個使用Borland C++(Delphi Forms)的多線程應用程序。我最近發現我可以在這些課程中使用Windows的消息服務的時候我所說的PostThreadMessage()函數:GetMessage的調用導致線程停止
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消息。
我希望這個例子不是太具體。我試圖離開任何有關的事情。基本上,這是一個沒有窗口的類的消息泵。
而(!的PeekMessage(MSG,NULL,WM_USER,WM_USER,PM_NOREMOVE)= 0){ 睡眠 (0); }; –