作者ljhgc (是嚮往亦或逃避)
看板C_and_CPP
標題Re: [問題] 請問兩thread如何傳遞進度?
時間Wed Nov 23 18:55:10 2011
可以用推文說的搭配 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