Hi, buddy: I want to say some words premature: i think we can use pthread_cond_signal to notify the event And maybe we should lock it with phread_mutex_lock & pthread_mutex_unlock and it maybe better to arrange pthread_cond_t and pthread_mutex_t, i mean, a struct(you can fill something else you want, e.g. for ResetEvent) You can read the super book(I haven't its book or pdf now) unix network programming volume 2(or maybe volume 1?) there is some sample code in it. And maybe you can read the source code of ACE(it did some wrapping work to cross platforms) pthread_cond_t eventList[4]; pthread_mutex_t hMutex[4]; #include "SignaledEvent.h" #include "RakAssert.h" SignaledEvent::SignaledEvent() { numEvents=0; } SignaledEvent::~SignaledEvent() { CloseEvents(); } void SignaledEvent::InitEvents(int numberOfEvents) { numEvents=numberOfEvents; RakAssert(numberOfEvents<4); for (int i=0; i < numEvents; i++) { #ifdef _WIN32 eventList[i]=CreateEvent(0, true, false, 0); #else pthread_mutex_init(&hMutex[i],NULL); pthread_cond_init(&eventList[i], NULL); #endif } } void SignaledEvent::CloseEvents(void) { for (int i=0; i < numEvents; i++) { #ifdef _WIN32 CloseHandle(eventList[i]); #else pthread_cond_destroy(&eventList[i]); pthread_mutex_destroy(&hMutex[i]); #endif } numEvents=0; } void SignaledEvent::ResetEvent(int index) { #ifdef _WIN32 ::ResetEvent(eventList[index]); #else ??? // I think we can ignore it if we needn't manully reset the event to initial state. #endif } void SignaledEvent::SetEvent(int index) { #ifdef _WIN32 ::SetEvent(eventList[index]); #else ??? pthread_mutex_lock(&hMutex[i]); pthread_cond_signal(&eventList[index]); pthread_mutex_unlock(&hMutex[i]); #endif } void SignaledEvent::ResetEvents(void) { for (int i=0; i < numEvents; i++) { #ifdef _WIN32 ::ResetEvent(eventList[i]); #else ??? // I think we can ignore it if we needn't manully reset the event to initial state. #endif } } void SignaledEvent::WaitOnEvents(int timeoutMs) { #ifdef _WIN32 WaitForMultipleObjects( 2, eventList, false, timeoutMs); #else ??? pthread_mutex_lock(&hMutex[i]); pthread_cond_wait( &eventList[i], &hMutex[i] ); pthread_mutex_unlock(&hMutex[i]); #endif } Thanks! > Date: Sat, 29 Aug 2009 11:31:52 -0700 > From: gameprogrammer@xxxxxxxxxx > To: gameprogrammer@xxxxxxxxxxxxx > Subject: [gameprogrammer] WaitFOrMultipleObjects on Linux? > > Anyone know how to fill this out? I put my guesses in, with ??? when I > didn't know > > pthread_cond_t eventList[4]; > pthread_mutex_t hMutex[4]; > > #include "SignaledEvent.h" > #include "RakAssert.h" > > SignaledEvent::SignaledEvent() > { > numEvents=0; > } > SignaledEvent::~SignaledEvent() > { > CloseEvents(); > } > > void SignaledEvent::InitEvents(int numberOfEvents) > { > numEvents=numberOfEvents; > RakAssert(numberOfEvents<4); > for (int i=0; i < numEvents; i++) > { > #ifdef _WIN32 > eventList[i]=CreateEvent(0, true, false, 0); > #else > pthread_cond_init(&eventList[i], NULL); > #endif > } > } > > void SignaledEvent::CloseEvents(void) > { > for (int i=0; i < numEvents; i++) > { > #ifdef _WIN32 > CloseHandle(eventList[i]); > #else > pthread_cond_destroy(&eventList[i]); > pthread_mutex_destroy(&eventList[i]); > #endif > } > numEvents=0; > } > > void SignaledEvent::ResetEvent(int index) > { > #ifdef _WIN32 > ::ResetEvent(eventList[index]); > #else > ??? > #endif > } > > void SignaledEvent::SetEvent(int index) > { > #ifdef _WIN32 > ::SetEvent(eventList[index]); > #else > ??? > #endif > } > > void SignaledEvent::ResetEvents(void) > { > for (int i=0; i < numEvents; i++) > { > #ifdef _WIN32 > ::ResetEvent(eventList[i]); > #else > ??? > #endif > } > } > > void SignaledEvent::WaitOnEvents(int timeoutMs) > { > #ifdef _WIN32 > WaitForMultipleObjects( > 2, > eventList, > false, > timeoutMs); > #else > ??? > pthread_cond_wait( &eventList[i], &hMutex[i] ); > #endif > } > > --------------------- > To unsubscribe go to http://gameprogrammer.com/mailinglist.html > > _________________________________________________________________ 约会说不清地方?来试试微软地图最新msn互动功能! http://ditu.live.com/?form=TL&swm=1