FXSingleEventThread.cpp
Go to the documentation of this file.00001
00002
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
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
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
00110
00111
00112
00113
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