我創建了一個作業執行緒,在作業執行緒里面設定了一個timer定時器,負責根據資料定時重繪主對話框界面的串列,重繪前用guard_lock對一個全域mteux上鎖,避免資料訪問沖突,主界面的一些訊息回應中也要對資料進行處理,所以處理前也要上鎖。
現在出現的問題是如果主界面的訊息回應反復上鎖,程式會卡住沒反應了,不知道是死鎖還是怎么回事,比如在雙擊訊息回應中上鎖,如果連續反復雙擊一會兒就會卡死,或者連續洗掉資料,洗掉前上鎖,有時候也會卡死,幫忙分析下什么問題
uj5u.com熱心網友回復:
你可以這樣試試:作業執行緒獲取資料,填充一個自定義的結構體,然后PostMessage訊息到UI執行緒,UI執行緒收到資料以后處理,處理完成以后通知作業執行緒執行下一次操作。偽代碼類似下面這樣:
UINT __cdecl ThreadProc(...)
{
...
MSG msg;
while(!bExitThread && GetMessage(&msg, NULL, 0, 0, 0)
{
switch(msg.message)
{
case MSG_XXX:
{
// 執行計算,填充結構體資料,發送自定義訊息通知UI執行緒。
}
}
}
...
}
LRESULT OnXXXXX(WPARAM, LPARAM) // UI執行緒的自定義訊息處理函式
{
// 決議資料,更新UI資訊
PostThreadMessage(...); // 通知執行緒執行下一次操作
}
uj5u.com熱心網友回復:
重繪作業有時候時間比較長,所以我開了個作業執行緒負責重繪,避免主界面卡頓,不然就直接在Ui執行緒重繪了
uj5u.com熱心網友回復:
guard_lock 按理不會鎖死,臨時變數析構會自動解鎖uj5u.com熱心網友回復:
好像找到原因了,作業執行緒在重繪主界面list的程序中,主執行緒進入等待狀態以后,重繪函式setitemtext會被阻塞,子執行緒也進去等待狀態,ui執行緒加鎖,作業執行緒不能重繪Ui控制元件轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/40483.html
標籤:進程/線程/DLL
上一篇:MFC顯示圖片求解!!!
