FXSingleEventThread.cpp

Go to the documentation of this file.
00001 /* =========================================================================
00002  * included modules
00003  * ======================================================================= */
00004 #ifdef _MSC_VER
00005 #include <windows_config.h>
00006 #else
00007 #include <config.h>
00008 #endif
00009 
00010 #include "MFXInterThreadEventClient.h"
00011 #include "FXSingleEventThread.h"
00012 #include "fxexdefs.h"
00013 #ifndef WIN32
00014 #include <pthread.h>
00015 #include <stdlib.h>
00016 #include <unistd.h>
00017 #else
00018 #include <process.h>
00019 #endif
00020 
00021 #ifdef CHECK_MEMORY_LEAKS
00022 #include <foreign/nvwa/debug_new.h>
00023 #endif
00024 
00025 #ifndef WIN32
00026 # define PIPE_READ 0
00027 # define PIPE_WRITE 1
00028 #endif
00029 
00030 using namespace FXEX;
00031 
00032 // Message map
00033 FXDEFMAP(FXSingleEventThread) FXSingleEventThreadMap[]={
00034     FXMAPFUNC(SEL_IO_READ,FXSingleEventThread::ID_THREAD_EVENT,FXSingleEventThread::onThreadSignal),
00035     FXMAPFUNC(SEL_THREAD,0,FXSingleEventThread::onThreadEvent),
00036 };
00037 FXIMPLEMENT(FXSingleEventThread,FXObject,FXSingleEventThreadMap,ARRAYNUMBER(FXSingleEventThreadMap))
00038 
00039 
00040 
00041 FXSingleEventThread::FXSingleEventThread(FXApp *a, MFXInterThreadEventClient *client)
00042         : FXObject(), myClient(client) {
00043     myApp = (a);
00044 #ifndef WIN32
00045     FXMALLOC(&event,FXThreadEventHandle,2);
00046     FXint res = pipe(event);
00047     FXASSERT(res == 0);
00048     myApp->addInput(event[PIPE_READ],INPUT_READ,this,ID_THREAD_EVENT);
00049 #else
00050     event=CreateEvent(NULL,FALSE,FALSE,NULL);
00051     FXASSERT(event != NULL);
00052     myApp->addInput(event,INPUT_READ,this,ID_THREAD_EVENT);
00053 #endif
00054 }
00055 
00056 
00057 FXSingleEventThread::~FXSingleEventThread() {
00058 #ifndef WIN32
00059     myApp->removeInput(event[PIPE_READ],INPUT_READ);
00060     ::close(event[PIPE_READ]);
00061     ::close(event[PIPE_WRITE]);
00062     FXFREE(&event);
00063 #else
00064     myApp->removeInput(event,INPUT_READ);
00065     ::CloseHandle(event);
00066 #endif
00067 }
00068 
00069 
00070 void
00071 FXSingleEventThread::signal() {
00072     FXuint seltype=SEL_THREAD;
00073 #ifndef WIN32
00074     ::write(event[PIPE_WRITE],&seltype,sizeof(seltype));
00075 #else
00076     ::SetEvent(event);
00077 #endif
00078 }
00079 
00080 
00081 void
00082 FXSingleEventThread::signal(FXuint seltype) {
00083 #ifndef WIN32
00084     ::write(event[PIPE_WRITE],&seltype,sizeof(seltype));
00085 #else
00086     ::SetEvent(event);
00087 #endif
00088 }
00089 
00090 
00091 long
00092 FXSingleEventThread::onThreadSignal(FXObject*, FXSelector, void*) {
00093     FXuint seltype=SEL_THREAD;
00094 #ifndef WIN32
00095     ::read(event[PIPE_READ],&seltype,sizeof(seltype));
00096 #else
00097     //FIXME need win32 support
00098 #endif
00099     FXSelector sel = FXSEL(SEL_THREAD,0);
00100     handle(this,sel,0);
00101     return 0;
00102 }
00103 
00104 
00105 long
00106 FXSingleEventThread::onThreadEvent(FXObject*,FXSelector ,void*) {
00107     myClient->eventOccured();
00108     /*
00109     FXuint seltype1 = FXSELTYPE(SEL_THREAD);
00110     if(myTarget && myTarget->handle(this,FXSEL(seltype1,mySelector),NULL)) {
00111     }
00112     FXuint seltype = FXSELTYPE(sel);
00113     return myTarget && myTarget->handle(this,FXSEL(seltype,mySelector),NULL);
00114     */
00115     return 1;
00116 }
00117 
00118 
00119 void
00120 FXSingleEventThread::sleep(long ms) {
00121 #ifdef WIN32
00122     Sleep(ms);
00123 #else
00124     long long us = ms * 1000;
00125     usleep(us);
00126 #endif
00127 }
00128 
00129 
00130 

Generated on Wed May 5 00:06:29 2010 for Sumo - Simulation of Urban MObility by  doxygen 1.5.6