2012-10-24 61 views
1

如何將數據傳遞給主應用程序的線程?如何將數據(結構)作爲消息傳遞給線程。

在主應用程序中,我創建了一個處理錯誤消息的線程。在主應用程序中處理數據時,如果出現錯誤,它會生成一條錯誤消息並將其填充到結構中。這個錯誤消息(結構)需要傳遞給線程,然後進一步處理它,主應用程序應繼續工作。我正在嘗試在Windows平臺上的C中執行此操作。

在我的應用程序中只會運行一個線程。目前我已經定義了一個全局變量結構(myData),並且我正在通過使用PostThreadMessage。

struct myData errorData; 

從主應用程序發佈使用

PostThreadMessage(ErrorLogId, THRD_MESSAGE_EXIT , 0 , (LPARAM)&errorData); 

的消息在線程我有

MsgReturn = GetMessage(&msg, NULL, THRD_MESSAGE_SOMEWORK, THRD_MESSAGE_EXIT); 

在它工作正常的時刻。但是,如果處理錯誤消息需要更多時間,那麼主應用程序可能會在全局結構errorData中獲取新錯誤並更新數據。

我可以使用鎖定機制,但我不能停止主應用程序,直到線程完成處理。如何傳遞數據而不將其作爲全局變量?

回答

1

解決方案是每次動態分配struct myData(使用malloc()),填充它並將其傳遞給線程進行處理。該線程在完成處理後負責處理該線程。

此方法消除了全局對象errorData(因爲不再需要)上的線程之間的任何同步。

0

編輯:

沒有意識到有一個消息隊列已經,對不起,還有那麼一個動態分配的消息,會做,當然。

舊的答案以供參考:

如果你不希望等到線程處理完錯誤信息,那麼你應該使用一個同步隊列用於通信的主線程和工人之間線。這是一些僞代碼來解釋我的意思:

輔助線程:

while (queue_is_empty()) 
    wait; 
lock(queue); 
process_error(read(queue)); 
unlock(queue); 

主線:

if (error) 
    lock(queue) 
    write(queue, error) 
    unlock(queue) 
    //possibly signal thread 

您沒有實現從無到有,你可以使用像RabbitMQ

2

你可能想創建每次您打電話給PostThreadMessage()時,都會有一個新的實例struct myData

線程需要free()這個實例的struct myData完成它。

將同步添加到您當前的方法將違背繁殖工作者的異步概念,同時繼續執行主要任務。

無論如何,在向共享日誌文件寫入內容時,線程仍然需要使用同步。

1

如何動態分配錯誤消息(使用malloc()),填充它並將指針傳遞給消息中的線程?然後該線程將與消息一起工作並釋放它(使用free())。

相關問題