[問題] C++多執行緒執行問題

看板C_and_CPP作者 (葉師父)時間5年前 (2018/09/13 10:38), 5年前編輯推噓3(3011)
留言14則, 6人參與, 5年前最新討論串1/1
開發平台(Platform): (Ex: Win10, Linux, ...) Win10, i7 四核心處理器 編譯器(Ex: GCC, clang, VC++...)+目標環境(跟開發平台不同的話需列出) VS2015 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) OpenCV 問題(Question): 各位先進大家好,我製作了一個透過WiFi傳輸讀取外部device傳來的影像然後即時顯示到 PC UI的程式,程式分為UI層及kernel層,kernel層是一個包成DLL函式,裡面有開執行緒 (可以設定開幾個執行緒),不斷地從kernel撈資料,然後透過callback方式傳到UI層即時 顯示。而為什麼撈資料要用多執行緒,是因為撈完資料後需要進行後處理,所以希望用多執 行緒的方式進行影像後處理,以免僅使用單執行緒後處理花太多時間卡頓畫面顯示。 測試後,我遇到的問題是,當我使用超過一個執行緒去跑的時候,畫面會有嚴重的卡頓,可是 當我在執行緒執行的loop裡面加入"printf()"函式,畫面就變得流暢多了??想請教先進有 甚麼多執行緒在設計的時候CPU資源方面我沒注意到的嗎?還是其他問題?? 十分感謝!! 餵入的資料(Input): 影像資料, 更新率大約8張/秒 預期的正確結果(Expected Output): 多執行緒抓取WiFi資料資料後能夠流暢地即時顯示在 UI 錯誤結果(Wrong Output): 沒有加入printf(),畫面卡頓,有加了printf(),畫面變流暢 程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔) class ThreadFunc { public: HANDLE hThread; bool bExitThread; DWORD dwThreadID; unsigned char uchNo; bool bIsRunning; public: ThreadFunc(HANDLE _hThread, bool _bExitThread, DWORD _dwThreadID, unsigned char _uchNo, bool _bIsRunning) : hThread(_hThread),bExitThread (_bExitThread), dwThreadID(_dwThreadID), uchNo(_uchNo), bIsRunning (_bIsRunning) {} ThreadFunc() { } ~ThreadFunc(){ } void LoopCycle(); static DWORD WINAPI CoreThread(void* Param) { ThreadFunc* This = (ThreadFunc*)Param; This->ThreadStart(); return NULL; } void Start() { hThread = CreateThread(NULL, 0, CoreThread, (void*) this, 0, &dwThreadID); } void Exit() { if (hThread) { bExitThread = true; WaitForSingleObject(hThread, INFINITE); CloseHandle(hThread); hThread = NULL; } } DWORD ThreadStart(void) { while (!bExitThread) { LoopCycle(); // 不斷地去撈影像資料並做後處理 printf("Thread No. is %d\n\n", uchNo); // 有加這一行, //程式會順很多;沒有這一 //行會卡頓 } return 0; } }; ThreadFunc* g_pcThreadFunc = new ThreadFunc[4]; // 開 > 1 個執行緒, 假設 // 4 個 補充說明(Supplement): -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.116.33.136 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1536806302.A.E19.html ※ 編輯: englishman (122.116.33.136), 09/13/2018 10:42:12

09/13 14:34, 5年前 , 1F
sleep(0); ?
09/13 14:34, 1F

09/13 14:48, 5年前 , 2F
Polling太快造成卡頓? 經驗是改成callback比較不會卡
09/13 14:48, 2F

09/13 14:51, 5年前 , 3F
直覺就是sleep一點點就好,別讓任何thread吸乾資源
09/13 14:51, 3F

09/13 14:59, 5年前 , 4F
直覺:給Thread一點休息時間,或是改成callback(比較
09/13 14:59, 4F

09/13 14:59, 5年前 , 5F
好)
09/13 14:59, 5F

09/17 14:23, 5年前 , 6F
感謝各位先進回答,加了Sleep()有效果,但需要加到Sleep
09/17 14:23, 6F

09/17 14:24, 5年前 , 7F
(40)才會變得不會頓。另外,有試過從底層callback上去
09/17 14:24, 7F

09/17 14:24, 5年前 , 8F
然後想讓UI直接畫圖,但沒有透過類似Android API 的
09/17 14:24, 8F

09/17 14:25, 5年前 , 9F
RunOnUIThread()這種function似乎直接畫是不可行的,請
09/17 14:25, 9F

09/17 14:25, 5年前 , 10F
問在Windows下面有類似RunOnUIThread這種切到main
09/17 14:25, 10F

09/17 14:26, 5年前 , 11F
Thread然後去畫Form1的圖的function或機制嗎?感謝!
09/17 14:26, 11F

09/18 20:34, 5年前 , 12F
應該是wifi 有收到東西, 再判斷是否完整
09/18 20:34, 12F

09/18 20:35, 5年前 , 13F
thread 再用 WaitForSingleObject() 等待 完整data
09/18 20:35, 13F

09/18 20:35, 5年前 , 14F
再開始處理, 處理完進 queue , main thread 來畫
09/18 20:35, 14F
文章代碼(AID): #1RcSsUuP (C_and_CPP)