00001 #include "bcdialog.h" 00002 #include "condition.h" 00003 #include "mutex.h" 00004 00005 00006 00007 00008 00009 BC_DialogThread::BC_DialogThread() 00010 : Thread(1, 0, 0) 00011 { 00012 gui = 0; 00013 startup_lock = new Condition(1, "BC_DialogThread::startup_lock"); 00014 window_lock = new Mutex("BC_DialogThread::window_lock"); 00015 } 00016 00017 BC_DialogThread::~BC_DialogThread() 00018 { 00019 startup_lock->lock("BC_DialogThread::~BC_DialogThread"); 00020 if(gui) 00021 { 00022 gui->lock_window(); 00023 gui->set_done(1); 00024 gui->unlock_window(); 00025 } 00026 startup_lock->unlock(); 00027 Thread::join(); 00028 00029 delete startup_lock; 00030 delete window_lock; 00031 } 00032 00033 void BC_DialogThread::lock_window(char *location) 00034 { 00035 window_lock->lock(location); 00036 } 00037 00038 void BC_DialogThread::unlock_window() 00039 { 00040 window_lock->unlock(); 00041 } 00042 00043 void BC_DialogThread::start() 00044 { 00045 if(Thread::running()) 00046 { 00047 window_lock->lock("BC_DialogThread::start"); 00048 if(gui) 00049 { 00050 gui->lock_window("BC_DialogThread::start"); 00051 gui->raise_window(1); 00052 gui->unlock_window(); 00053 } 00054 window_lock->unlock(); 00055 return; 00056 } 00057 00058 // Don't allow anyone else to create the window 00059 startup_lock->lock("BC_DialogThread::start"); 00060 Thread::start(); 00061 00062 // Wait for startup 00063 startup_lock->lock("BC_DialogThread::start"); 00064 startup_lock->unlock(); 00065 } 00066 00067 void BC_DialogThread::run() 00068 { 00069 gui = new_gui(); 00070 startup_lock->unlock(); 00071 int result = gui->run_window(); 00072 00073 handle_done_event(result); 00074 00075 window_lock->lock("BC_DialogThread::run"); 00076 delete gui; 00077 gui = 0; 00078 window_lock->unlock(); 00079 00080 handle_close_event(result); 00081 } 00082 00083 BC_Window* BC_DialogThread::new_gui() 00084 { 00085 printf("BC_DialogThread::new_gui called\n"); 00086 return 0; 00087 } 00088 00089 BC_Window* BC_DialogThread::get_gui() 00090 { 00091 return gui; 00092 } 00093 00094 void BC_DialogThread::handle_done_event(int result) 00095 { 00096 } 00097 00098 void BC_DialogThread::handle_close_event(int result) 00099 { 00100 } 00101 00102 00103 00104
1.5.5