看板 C_and_CPP 關於我們 聯絡資訊
可以用推文說的搭配 CreateEvent HANDLE hEvent = NULL; DWORD WINAPI GetDataLoop(LPVOID lpParam) { while(1) { WaitForSingleObject(hEvent, INFINITE);//這會無限等待,直到 //hEvent被設定為signaled //當hEvent被設為signaled瞬間,會將hEvent設為nonsignaled作鎖定 printf("YUV420toRGB\n"); SetEvent(hEvent); //把hEvent設回signaled } return 0; } DWORD WINAPI RenderingLoop(LPVOID lpParam) { while(1) { WaitForSingleObject(hEvent, INFINITE); printf("cvShowImage\n"); SetEvent(hEvent); } return 0; } void main() { hEvent = CreateEvent( NULL, false, false, NULL ); SetEvent(hEvent); DWORD ThreadID; HANDLE aThread; aThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)GetDataLoop, NULL, 0, &ThreadID); Sleep(1); aThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)RenderingLoop, NULL, 0, &ThreadID); } ※ 引述《DrStein (啤酒肚)》之銘言: : 開發平台(Platform): (Ex: VC++, GCC, Linux, ...) : windows就好 : 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) : 用了openCV當顯示函數 : 問題(Question): : 是這樣的 開啟了兩個線程,一個在讀YUV資料,並轉為RGB格式 : 另個線程就一直調用openCV做顯示 : : : 程式中比較重要的部份就這兩個函數(兩個線程的主函數) : DWORD WINAPI GetDataLoop(LPVOID lpParam) : { : param *m_pPara; : m_pPara = (param*)lpParam; : unsigned int graySize; : graySize = m_pPara->width*m_pPara->height; : int sts; : while(1) : { : sts = ReadDataFromHardDisk(m_pPara->pYUV, m_pPara->fp, m_pPara->width, : m_pPara->height); : if( -1 == sts) : break; : YUV420toRGB(m_pPara->pYUV, m_pPara->pYUV + graySize, m_pPara->pYUV + : graySize*5/4, : m_pPara->width, m_pPara->height, m_pPara->pRGBAImage->imageData, BGRA); : }/*while*/ : return 0; : }/*ReadHDLoop*/ : DWORD WINAPI RenderingLoop(LPVOID lpParam) : { : param *m_pPara; : m_pPara = (param*)lpParam; : int cnt = 0; : while(1) : { : DWORD ExitCode; : GetExitCodeThread(m_pPara->getDataThread, &ExitCode); : if(STILL_ACTIVE != ExitCode) : break; : printf("%d frame\n", cnt++); : cvShowImage("Image", m_pPara->pRGBAImage); : cvWaitKey(1); : } : return 0; : }/*RenderingLoop*/ : 現在我想做的是 一張圖只被顯示一次 : 也就是 GetDataLoop這線程中,調用YUVtoRGB後, : 可以發個訊號給 RenderingLoop,而RenderingLoop在沒收到這訊號前 : ,是不可以調用cvShowImage的(好比只能等待這類的) : 反之,在cvShowImage還沒節束前,GetDataLoop這線程不能調用 : YUV420toRGB ( 會寫同一塊緩衝) : 簡單講就是線程間的通信,最簡單的作法當然是用 static isLocked來作 : 那請問有沒有較制式或標準的作法或API呢? : 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 220.130.148.139
DrStein:謝謝 問題解決了 現在時間對的很準了 感恩 11/23 19:00
DrStein:順便問一下,有沒辦法去查訊g_hEvent的狀態 11/23 19:14
DrStein:目地是當第一個線程要終止時,發個訊號,第二個收到 11/23 19:15
DrStein:就跟著一起終止(要死一起死) 11/23 19:15
DrStein:我現在做法是把第一個線程的具柄 傳到第二個線程 11/23 19:18
DrStein:然後用GetExitCodeThread 查詢 是可以用 但感覺這樣不太好 11/23 19:19
ljhgc:WaitForSingleObject 也可以餵線程的HANDLE 11/23 19:37
ljhgc:INFINITE 那邊改一下,改成你想等多久不要用無限等待。單位是 milliseconds
ljhgc:看是等到 WAIT_OBJECT_0 還是 WAIT_TIMEOUT 就能知道線程的 11/23 19:39
ljhgc:狀態。 WAIT_TIMEOUT 表示線程還活著 11/23 19:39
※ 編輯: ljhgc 來自: 220.130.148.139 (11/23 19:42) ※ 編輯: ljhgc 來自: 220.130.148.139 (11/23 19:43)
VictorTom:推:) 11/24 00:23