開發平台(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):