C_and_CPP 板


LINE

※ 引述《eric231 (嘻嘻雷夢)》之銘言: : 各位大大好 : 目前有一個command line下的USB測試程式 : 用winapi 的方式畫出一個UI : 功能需求是想用本來在main loop 底下跑的function然後去 : 偵測event然後即時顯示在listbox上 : 請問是不是需要另外用 winapi create一個tread去run本來 : main loop 底下跑的function? : 附上程式碼 : https://ideone.com/3lDWUG 你沒有描述要怎樣偵測 event, 就先簡設是大概是 event = tcx_GetEvent(u8_Port) 吧 一般 IO 分兩種情況 1. blocking 2. non-blocking (3. asynchronous 這種先不管, 你應該暫時不會用到, 但這其實才是 event-driven 下最常見的用法) blocking 就是 tcx_GetEvent 一定要得到一個 event 或 error, 如果沒 event 就卡住, 所以叫 blocking. 這是最單純最常見的用法 這種 case 一定要 CreateTherad, 不然 UI 卡住滑鼠點下去不理你, 然後就會跳出 程式沒有回應 non-blocking 就是 call 會立即傳回, 如果沒東西就回無. 如果是這種 case, 其實也不用 CreateThread 了. 因為沒意外的話, 你的 thread function 大概也是 while (1) { event = tcx_GetEvent(u8_Port); // 處理 event sleep (TIME_FOR_NEXT_EVENT); } 那不如直接 set timer 用原本的 message loop 來處理就好了, 反而還 簡單俐落些. 當然, 若要處理的事很多而影響到處理其他 UI 訊息的話, 也可以開一條 thread 來處理 以 event-driven programming 的慣用流程就是 1. 開一個 worker thread 2. 在 worker thread 裡處理工作 3. 更新 UI 看推文你應該對 UI 基本概念都有了, 應該只是 WinAPI 不熟不知道怎麼更新 UI? 基本上 UI 不是 thread-safe, 所以不能直接從 worker thread 操作 listbox. 慣用方法就是丟一個 message 回 UI thread 的 message queue. 而在 WinAPI 就是用 SendMessage 或 PostMessage 丟 SendMessage/PostMessage 四個參數 1. Window handle 2. Message 3. wParam 4. lParam Window handle 是用來指定要丟進去的 message queue, 因為要丟回原本的 UI thread, 所以是填一開始 CreateWindow 的得到的 handle Message 是想丟進去的 message, 這裡應該自訂一個 USB event 例如 #define WM_MY_TCX_EVENT (WM_USER+1) wParam 和 lParam 是兩個額外要和這個 event 一起丟給 message queue 的參數 他們的 size 都應至少夠裝一個 poiter https://msdn.microsoft.com/en-us/library/aa383751(VS.85).aspx 以上整合起來, 在 worker thread 那端大致是這樣 while (!quit) { event = tcx_GetEvent(u8_Port); if (event == -1) ExitThread(-1); else SendMessage(hwnd, WM_MY_TCX_EVENT, event, 0); // get next usb event } ExitThread(0); 而 UI 那端則是 WndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { ... switch (uMsg) { case WM_MY_TCX_EVENT: // 處理 wParam 傳來的 event break; } } 另外有一些 thread synchonization 的要注意一下. SendMessage 一般比較常用, 而他和 PostMessage 的差別是, SendMessage 會等待該 message 被處理完才 return, 但 PostMessage 丟了就 return 了. 示意流程是這樣 UI Worker | | | tcx_GetEvent |<------------ SendMessage WinProc WM_MY_TCX_EVENT | ------------------| | tcx_GetEvent |<------------ SendMessage WinProc WM_MY_TCX_EVENT ... | 當 worker thread 卡著時, UI thread 還是可以處理其他 event, 但 SendMessage 會卡住等待 message 被處理. 若是 PostMessage 的話, 一但將訊息丟出去, 就可以接著處理下個 tcx_GetEvent 了. 若 USB event 不是單純的 ID, 而是透過一個 shared global 變數來傳遞, 那 SendMessage 本身可以想成一個是 synchonize 這個 global 變數的機制. 另一方面, 若 USB Event 的量很大, 使用 SendMessage 同步反而會限制住 worker thead 接受的速度, 那麼應該使用一個 receving queue, 收到的東 西往裡面倒, 用 PostMessage 通知 UI 後, 就再緊接著收下個 USB Event 其他 WinAPI synchrnozation 的方式可以在 MSDN 上找找 Synchronization Objects 有關的東西 --



※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 114.43.5.247
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_and_CPP/M.1508344424.A.1D3.html
1F:推 freaky: 簡單說,只使用一個UI thread,其他thread用PostMessage() 10/28 23:24
2F:→ freaky: 避免使用SendMessage()以防止deadlock。 10/28 23:25
3F:→ freaky: https://tinyurl.com/ya99ndpm 10/28 23:27







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP