[問題] SetEvent無法再次呼叫thread
這支程式是這樣的
在迴圈前分別產生WakeEvent_1&WakeEvent_2與ThreadOne&ThreadTwo
並且在兩個Thread裡面用WaitForSingleObject(WakeEvent, INFINITE)來等待
之後進入回圈,在迴圈內分別隨機產生5個數字至in_1和in_2這兩個陣列
之後再用SetEvent(WakeEvent)來提醒Thread,之後顯示完再用ResetEvent(WakeEvent)
來重置,迴圈內就做五遍這樣的動作
但問題來了,在剛進入迴圈時SetEvent還能夠提醒兩個Thread,之後就完全進不去Thread...
麻煩指教一下,感謝!
以下是code
/* AES Encryption System*/
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <windows.h>
#define SIZE 5 //資料數
int n_1[SIZE];
int n_2[SIZE];
void ThreadOne(LPVOID params_1);//thread1
void ThreadTwo(LPVOID params_2);//thread2
int bubble(int n[])//bubble sort
{
int temp,i,j;
for(j=0;j<SIZE;j++)
for(i=0;i<SIZE-j-1;i++)
if(n[i]>n[i+1]) {
temp = n[i];
n[i] = n[i+1];
n[i+1] = temp;
}
return 0;
}
int main() {
//thread
HANDLE hThread_1;
HANDLE hThread_2;
HANDLE WakeEvent_1 = CreateEvent(NULL, TRUE, FALSE, NULL);
HANDLE WakeEvent_2 = CreateEvent(NULL, TRUE, FALSE, NULL);
DWORD threadId;
int count=1,i;
srand(time(NULL));
hThread_1 =
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadOne,WakeEvent_1,0,&threadId);
hThread_2 =
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)ThreadTwo,WakeEvent_2,0,&threadId);
for(count = 1; count <= 5; count++) {
//區塊1
for(i=0;i<SIZE;i++)
n_1[i] = rand()%100;
//printf("呼叫SetEvent(WakeEvent_1);\n");
SetEvent(WakeEvent_1);
//區塊2
for(i=0;i<SIZE;i++)
n_2[i] = rand()%100;
//printf("呼叫SetEvent(WakeEvent_2);\n");
SetEvent(WakeEvent_2);
printf("count = %d\n",count);
WaitForSingleObject(hThread_1, INFINITE);
for(i = 0; i < SIZE; i++)
printf("n_1[%d]=%d\n",i,n_1[i]);
ResetEvent(WakeEvent_1);
WaitForSingleObject(hThread_2, INFINITE);
for(i = 0; i < SIZE; i++)
printf("n_2[%d]=%d\n",i,n_2[i]);
ResetEvent(WakeEvent_2);
}//for(count = 1; count < 5; count++) end
//close handles
CloseHandle(hThread_1);
//close handles
CloseHandle(hThread_2);
system("pause");
}
void ThreadOne(LPVOID params_1)//thread1
{
printf("已經進入ThreadOne\n");
HANDLE WakeEvent_1 = (HANDLE)params_1;
DWORD rc = WaitForSingleObject(WakeEvent_1, INFINITE);
switch (rc) {
case WAIT_OBJECT_0:
// wakeEvent signaled
//printf("已經進入ThreadOne WAIT_OBJECT_0\n");
bubble(n_1);//bubble sort
break;
case WAIT_TIMEOUT:
//printf("已經進入ThreadOne WAIT_TIMEOUT\n");
break;
case WAIT_ABANDONED:;
// main thread ended
//printf("已經進入ThreadOne WAIT_ABANDONED\n");
}
}
void ThreadTwo(LPVOID params_2)//thread2
{
printf("已經進入ThreadTwo\n");
HANDLE WakeEvent_2 = (HANDLE)params_2;
DWORD rc = WaitForSingleObject(WakeEvent_2, INFINITE);
switch (rc) {
case WAIT_OBJECT_0:
// wakeEvent signaled
//printf("已經進入ThreadTwo WAIT_OBJECT_0\n");
bubble(n_2);//bubble sort
break;
case WAIT_TIMEOUT:
//printf("已經進入ThreadTwo WAIT_TIMEOUT\n");
break;
case WAIT_ABANDONED:;
// main thread ended
//printf("已經進入ThreadTwo WAIT_ABANDONED\n");
}
}
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 118.169.103.101
討論串 (同標題文章)
完整討論串 (本文為第 1 之 2 篇):