15,472
社区成员
发帖
与我相关
我的任务
分享
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);
}
}
}
#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;
}