Re: [問題] 請問兩thread如何傳遞進度?

看板C_and_CPP (C/C++)作者 (是嚮往亦或逃避)時間14年前 (2011/11/23 18:55), 編輯推噓3(307)
留言10則, 3人參與, 最新討論串2/2 (看更多)
可以用推文說的搭配 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

11/23 19:00, , 1F
謝謝 問題解決了 現在時間對的很準了 感恩
11/23 19:00, 1F

11/23 19:14, , 2F
順便問一下,有沒辦法去查訊g_hEvent的狀態
11/23 19:14, 2F

11/23 19:15, , 3F
目地是當第一個線程要終止時,發個訊號,第二個收到
11/23 19:15, 3F

11/23 19:15, , 4F
就跟著一起終止(要死一起死)
11/23 19:15, 4F

11/23 19:18, , 5F
我現在做法是把第一個線程的具柄 傳到第二個線程
11/23 19:18, 5F

11/23 19:19, , 6F
然後用GetExitCodeThread 查詢 是可以用 但感覺這樣不太好
11/23 19:19, 6F

11/23 19:37, , 7F
WaitForSingleObject 也可以餵線程的HANDLE
11/23 19:37, 7F
ljhgc:INFINITE 那邊改一下,改成你想等多久不要用無限等待。單位是 milliseconds

11/23 19:39, , 8F
看是等到 WAIT_OBJECT_0 還是 WAIT_TIMEOUT 就能知道線程的
11/23 19:39, 8F

11/23 19:39, , 9F
狀態。 WAIT_TIMEOUT 表示線程還活著
11/23 19:39, 9F
※ 編輯: ljhgc 來自: 220.130.148.139 (11/23 19:42) ※ 編輯: ljhgc 來自: 220.130.148.139 (11/23 19:43)

11/24 00:23, , 10F
推:)
11/24 00:23, 10F
文章代碼(AID): #1EpD4Jns (C_and_CPP)
討論串 (同標題文章)
文章代碼(AID): #1EpD4Jns (C_and_CPP)