[爆卦]單執行緒多執行緒是什麼?優點缺點精華區懶人包

為什麼這篇單執行緒多執行緒鄉民發文收入到精華區:因為在單執行緒多執行緒這個討論話題中,有許多相關的文章在討論,這篇最有參考價值!作者englishman (葉師父)看板C_and_CPP標題[問題] C++多執行緒執行問題時間T...

單執行緒多執行緒 在 偶然?占心|感情合盤|催眠培訓|調頻療癒|AcBars Instagram 的最讚貼文

2021-09-24 14:14:34

半途而廢為什麼不行? ⁡ 在過去我們因為教育觀念而學習到,半途而廢是不好的、是可恥的。放棄是會導致失敗的、不可以三分鐘熱度,這樣很糟糕~等等想法。如果堅持是一個美德,那中途放棄就變成一種社會道德及認知上的約束。 ⁡ 我在做療癒或是催眠個案時,大約有9成以上的案例都因為這樣的限制性信念,讓自己一直生活...


開發平台(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
s4300026: sleep(0); ? 09/13 14:34
VSei: Polling太快造成卡頓? 經驗是改成callback比較不會卡 09/13 14:48
eye5002003: 直覺就是sleep一點點就好,別讓任何thread吸乾資源 09/13 14:51
dontfindme: 直覺:給Thread一點休息時間,或是改成callback(比較 09/13 14:59
dontfindme: 好) 09/13 14:59
englishman: 感謝各位先進回答,加了Sleep()有效果,但需要加到Sleep 09/17 14:23
englishman: (40)才會變得不會頓。另外,有試過從底層callback上去 09/17 14:24
englishman: 然後想讓UI直接畫圖,但沒有透過類似Android API 的 09/17 14:24
englishman: RunOnUIThread()這種function似乎直接畫是不可行的,請 09/17 14:25
englishman: 問在Windows下面有類似RunOnUIThread這種切到main 09/17 14:25
englishman: Thread然後去畫Form1的圖的function或機制嗎?感謝! 09/17 14:26
easyman: 應該是wifi 有收到東西, 再判斷是否完整 09/18 20:34
easyman: thread 再用 WaitForSingleObject() 等待 完整data 09/18 20:35
easyman: 再開始處理, 處理完進 queue , main thread 來畫 09/18 20:35

你可能也想看看

搜尋相關網站