[問題] SetEvent無法再次呼叫thread

看板C_and_CPP作者 (Levin)時間16年前 (2009/12/09 21:47), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/2 (看更多)
這支程式是這樣的 在迴圈前分別產生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
文章代碼(AID): #1B7wfWCN (C_and_CPP)
文章代碼(AID): #1B7wfWCN (C_and_CPP)