看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《windincloud (當你孤單會想起誰)》之銘言: : ( *[1m *[m 為色碼,可以按 Ctrl+V 預覽會顯示的顏色 ) : ( 未必需要依照此格式,文章條理清楚即可 ) : 遇到的問題: (題意請描述清楚) : 目前利用VC+postmessage開發 : 在寫程式的過程發現我寫出來的code在處理post message中的func() : 會因下一個trigger到了 又跳去丟一次post message 而造成func()沒法執行完整 : 希望能有哪位大大能幫忙解決一下~ 感謝~ : 希望得到的正確結果: : 希望能將post message中所呼叫的func()執行完成OB : 程式跑出來的錯誤結果: : 開發平台: (例: VC++ or gcc/g++ or Dev-C++, Windows or Linux) : VC + WinXP : 有問題的code: (請善用置底文標色功能) : 以下是pseudo code : BEGIN_MSG_MAP(SingleChannelPlaybackView) : MESSAGE_HANDLER(WM_GoSetImageToVideo, OnEventToVideo) : END_MSG_MAP() : onFrameReady() : { : postmessage(WM_GoSetImageToVideo, reinterpret_cast<WPARAM>(data), 0); : } : OnEventToVideo() : { : DEVICE_IMAGE *Img_Info = reinterpret_cast<DEVICE_IMAGE *>(wParam); : SetImageToVideo(Img_Info); //這行沒執行完 onFrameReady()就被trigger : //然後這行就沒執完 : delete Img_Info; : return 0; : } : SetImageToVideo(DEVICE_IMAGE &Img_Info) : { : if(Img_Info) : { : push_Frame(); //這個function 內部還會有很多小func() : } : } : 補充說明: 自問自答: 過了一段時間又回過頭處理這問題~ 發現會有這樣狀況是Message Queue在處理Function時 若後續的程式處理出現狀況 這樣會造成Queue無法處理 但Queue後面還有人排隊~ 因此就處理後面的人~ 原先的ERROR可能就被忽略或傳送到系統內部錯誤訊息Queue處理 所以就造成一直被中斷的假象~ --- 這樣的問題似乎會出現在沒設計好的程式上面 所以做專案碰到這樣的問題 請追看看後面的程式是否有些錯誤沒有HANDLE到~ -- 接前人的CASE真的很累~ 改不動之外 要是設計又差~ 真的不知到炸彈埋在哪~ Orz -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 203.73.98.64
layan:改用SendMessage或把request queue起來 另開thread dequeue? 03/21 01:20
windincloud:我會再去試看看~ 不過我似乎要先了解Message Loop :P 03/21 14:49
einstain:當程式執行出現 error 會跳出 dialog box 時 03/22 10:49
einstain:那個 dialog box 會有 message loop 處理訊息 03/22 10:50
einstain:所以你會看到奇怪的 call stack 或是 function reentry 03/22 10:50