当启用多个线程时,如何知道它们当中谁先完成

$扫地僧$ 2013-06-05 07:33:36

typedef struct _THREAD_PARAM{
DWORD ProdID;
DWORD StockID;
int random;
}THREAD_PARAM,*LPTHREAD_PARAM;
DWORD WINAPI FunlProc(LPVOID lpParameter)
{
LPTHREAD_PARAM pData;;
pData=(LPTHREAD_PARAM)lpParameter;
//int random=rand()%1000;

for (int n = 0; n < pData->random; n++)
{
Sleep(100);
}

TRACE("TID =%u,\t ProdID=%u,\t StockID=%u,\t random=%d\n",GetCurrentThreadId(),pData->ProdID,pData->StockID,pData->random);
HeapFree(GetProcessHeap(),0,pData);
return 0;
}

void CThreadDemoDlg::OnButtonTest()
{
// TODO: Add your control notification handler code here
MessageBox("测试开启");
int ThreadNumber;
int i;
LPTHREAD_PARAM pData;
HANDLE hThread[3];
DWORD dw;
int iUseThread;

for(i=0;i<3;i++)
{
hThread[i]=NULL;
}

for(ThreadNumber=1;ThreadNumber<=12;ThreadNumber++)
{
if (ThreadNumber<=3)
{
pData=(LPTHREAD_PARAM)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(THREAD_PARAM));
if(pData==NULL)
{
MessageBox("内存分配错误");
return;
}
pData->ProdID=ThreadNumber ;//(ThreadNumber*10)+i;
pData->StockID=(ThreadNumber*100)+i;
pData->random=rand()%100;
hThread[ThreadNumber-1]=CreateThread(NULL,0,FunlProc,pData,0,NULL);
if(hThread[ThreadNumber-1]==NULL)
{
ExitProcess(ThreadNumber-1);
}
}
else
{

iUseThread=-1;
while(iUseThread==-1)
{
for(i=0;i<3;i++)
{
dw=WaitForSingleObject(hThread[i],INFINITE);

if(dw==WAIT_OBJECT_0)
{
TRACE("ThreadNumber=%d\t iUseThread=%d\n",ThreadNumber,i);
iUseThread=i;
CloseHandle(hThread[i]);
break;
}
}
}

pData=(LPTHREAD_PARAM)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(THREAD_PARAM));
if(pData==NULL)
{
MessageBox("内存分配错误");
return;
}
pData->ProdID=ThreadNumber;//(ThreadNumber*10)+i;
pData->StockID=(ThreadNumber*100)+i;
pData->random=rand()%100;
hThread[iUseThread]=CreateThread(NULL,0,FunlProc,pData,0,NULL);
if(hThread[iUseThread]==NULL)
{
ExitProcess(iUseThread);
}
}
}



dw=WaitForSingleObject(hThread[i],INFINITE);
if(dw==WAIT_OBJECT_0)
{
TRACE("ThreadNumber=%d\t iUseThread=%d\n",ThreadNumber,i);
iUseThread=i;
CloseHandle(hThread[i]);
break;
}
我的本意是想判断3个线程中 谁先完成 就用谁又在开启一个线程
但总的线程数量 只有3个
但是使用WaitForSingleObject 变成了始终去等第一个线程完成去了
这个地方 我向请问下各位大侠 该怎么写
或者说 当我要开启N个任务要做时 但一次只允许有3个线程去处理,谁先做完后,就立即释放一个线程,同时又在开启一个线程时 这种情况该怎么处理比较好 谢谢各位了!
...全文
159 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
LostSpeed 2013-06-05
  • 打赏
  • 举报
回复
vs2008 msdn 上有例子 ms-help://MS.VSCC.v90/MS.MSDNQTR.v90.en/dllproc/base/waiting_for_multiple_objects.htm

#include <windows.h>
#include <stdio.h>

HANDLE ghEvents[2];

DWORD WINAPI ThreadProc( LPVOID );

void main()
{
    HANDLE hThread; 
    DWORD i, dwEvent, dwThreadID; 

    // Create two event objects

    for (i = 0; i < 2; i++) 
    { 
        ghEvents[i] = CreateEvent( 
            NULL,   // default security attributes
            FALSE,  // auto-reset event object
            FALSE,  // initial state is nonsignaled
            NULL);  // unnamed object

        if (ghEvents[i] == NULL) 
        { 
            printf("CreateEvent error: %d\n", GetLastError() ); 
            ExitProcess(0); 
        } 
    } 

    // Create a thread

    hThread = CreateThread( 
                 NULL,         // default security attributes
                 0,            // default stack size
                 (LPTHREAD_START_ROUTINE) ThreadProc, 
                 NULL,         // no thread function arguments
                 0,            // default creation flags
                 &dwThreadID); // receive thread identifier

    if( hThread == NULL )
    {
        printf("CreateThread error: %d\n", GetLastError());
        return;
    }

    // Wait for the thread to signal one of the event objects

    dwEvent = WaitForMultipleObjects( 
        2,           // number of objects in array
        ghEvents,     // array of objects
        FALSE,       // wait for any object
        5000);       // five-second wait

    // The return value indicates which event is signaled

    switch (dwEvent) 
    { 
        // ghEvents[0] was signaled
        case WAIT_OBJECT_0 + 0: 
            // TODO: Perform tasks required by this event
            printf("First event was signaled.\n");
            break; 

        // ghEvents[1] was signaled
        case WAIT_OBJECT_0 + 1: 
            // TODO: Perform tasks required by this event
            printf("Second event was signaled.\n");
            break; 

        case WAIT_TIMEOUT:
            printf("Wait timed out.\n");
            break;

        // Return value is invalid.
        default: 
            printf("Wait error: %d\n", GetLastError()); 
            ExitProcess(0); 
    }

    // Close event handles

    for (i = 0; i < 2; i++) 
        CloseHandle(ghEvents[i]);    
}

DWORD WINAPI ThreadProc( LPVOID lpParam )
{
    // Set one event to the signaled state

    if ( !SetEvent(ghEvents[0]) ) 
    {
        printf("SetEvent failed (%d)\n", GetLastError());
        return -1;
    }
    return 1;
}

yaozhiyong110 2013-06-05
  • 打赏
  • 举报
回复
先完成的把自己的threadid放入一个全局vector呗
$扫地僧$ 2013-06-05
  • 打赏
  • 举报
回复
搞个线程池阿 --------- 能否给我实例我参考下!3QWaitForMultiObject WaitForMultiObject 这个有试个 这个函数会等待多个线程完成,我想的是谁先完成 谁就开启新的线程 但总线程不能超过我设定的数
凤矶 2013-06-05
  • 打赏
  • 举报
回复
WaitForMultiObject
快乐鹦鹉 2013-06-05
  • 打赏
  • 举报
回复
搞个线程池阿

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧