多线程同步读取多路视频流

多线程同步读取多路视频流

 

#define  N 6

HANDLE hSuspend[N], hResume[N];
HANDLE hSuspend_one;
HANDLE hResume_one;

struct  info
{
    CRITICAL_SECTION  ProtectSection;
    
int id;
    
int frames;
}
;


unsigned 
long  __stdcall testFun( void   * pContext)
{
    info
* pInfo = (info*)pContext;
    
while(1)
    
{    
        EnterCriticalSection(
&pInfo->ProtectSection);
        pInfo
->frames++;    
        
//printf("run sub Thread  video %d frames %d\n", pInfo->id, pInfo->frames);
    
//    DWORD rtn = WaitForSingleObject(hSuspend[pInfo->id], INFINITE);
        DWORD rtn = WaitForSingleObject(hSuspend_one, INFINITE);
        
if (WAIT_OBJECT_0 == rtn)
        
{// 自己暂停自己
            
        
//    printf("stop sub Thread video %d frames %d\n", pInfo->id, pInfo->frames);
            WaitForSingleObject(hResume[pInfo->id], INFINITE);
            
//WaitForSingleObject(hResume_one, INFINITE);
        }

        LeaveCriticalSection(
&pInfo->ProtectSection);
    }

    
return 0;
}



int  main()
{
    
    DWORD thid;
    HANDLE hand[N];
    
    
int mainframes = 0;
    info myInfo[N];

    hSuspend_one 
= CreateEvent(NULL, TRUE, FALSE, NULL);
    
for(int i = 0; i < N; i++)
    
{
        hSuspend[i] 
= CreateEvent(NULL, TRUE, FALSE, NULL);
        hResume[i] 
= CreateEvent(NULL, FALSE, FALSE, NULL);
        myInfo[i].id 
= i;
        myInfo[i].frames 
= 0;
        InitializeCriticalSection(
&myInfo[i].ProtectSection);
    }

    
for(int i = 0; i < N; i++)
    
{
        hand[i] 
= CreateThread( NULL, NULL, testFun, &myInfo[i], CREATE_SUSPENDED, &thid);
    }


    
for(int i = 0; i < N; i++)
    
{
        ResumeThread(hand[i]);
    }

    
while(1)
    
{
        printf(
"main thread frames %d\n"++mainframes);
        
/**//*for(int i = 0; i < N; i++)
        {        
            SetEvent(hSuspend[i]);
        }
*/

        SetEvent(hSuspend_one);
        
        Sleep(
5);
        
for(int i = 0; i < N; i++)
        
{    
            printf(
"main thread video %d frames %d\n",myInfo[i].id,myInfo[i].frames);    
        }

        printf(
"\n");
        
        
for(int i = 0; i < N; i++)
        
{            
            SetEvent(hResume[i]);
        }

    }

    
    
for(int i = 0; i < N; i++)
    
{
        WaitForSingleObject(hand[i], INFINITE);    
        DeleteCriticalSection( 
&myInfo[i].ProtectSection);
        CloseHandle(hand[i]);
        CloseHandle(hResume[i]);
        CloseHandle(hSuspend[i]);
    }

    CloseHandle(hSuspend_one);
    
return 0;
}

 

你可能感兴趣的:(多线程同步读取多路视频流)