// drawthre.h // Luokat piirtosäikeen luomiseksi. // Vesa Lappalainen 12.10.1996 // Testattu: OWL 5.0 (DLL ja static) + BC 5.01 + Win95 // Käyttö: ks. cDrawingThreadFrame //------------------------------------------------------------------------------ // Piirtosäie perit.yleisestä säikeestä ja siihen lisätään omat erikoispiirt. // Omaan tästä perittävään säikeeseen lisätään sitten Run-metodi #ifndef DRAWTHRE_H #define DRAWTHRE_H class cDrawingThread : public TThread { TClientDC *pdc; HDC hdc; TWindow *pWnd; int terminating; public: cDrawingThread() { terminating = 0; pdc = NULL; pWnd = NULL; } ~cDrawingThread() { delete pdc; } void Window(TWindow *w) { pWnd = w; pdc = new TClientDC(*w); hdc = *pdc; } int Kill(uint ms) { terminating = 1; TerminateAndWait(ms); terminating = 0; return ( GetStatus() == Running ); } int Terminating() { return terminating; } HDC hDC() { return hdc; } TWindow &Wnd() { return *pWnd; } }; //------------------------------------------------------------------------------ // Tämä on raami piirtosäikeelle, joka huolehtii säikeen luomisesta ja // hävittämisestä siten, että käynnissä oleva piirto voidaan käynnistää // uudelleen. Samoin tämän hväittäjä huolehtii siitä, että piirto // lopetetaan tämän luokan hävitessä. // Käyttö esim: // 1) Luo oma cDrawingThreadista peritty luokka, esim cPiirto // 2) Esittele ikkunaluokassa cDrawingThreadFrame Piirto; // 3) WM_PAINT-viestin käsittelijässä: Piirto.Start(this,10); template class cDrawingThreadFrame { int priority; cDrawingThread *process; TWindow *pWnd; public: cDrawingThreadFrame() { priority = THREAD_PRIORITY_NORMAL; process = NULL; } ~cDrawingThreadFrame() { Kill(); } void SetPriority(int pri) { priority = pri; if ( process ) process->SetPriority(pri); } void Kill(int i=0) { if ( process == NULL ) return; // Jos tullaan Timeoutin takia pihalle, ei prosessia voida poistaa! if ( process->Kill(4000) == 0 ) delete process; process = NULL; } void Start(TWindow *w,TYPE param) { pWnd = w; Kill(); process = new DTHREAD(param); if ( !process ) return; process->Window(w); process->Start(); process->SetPriority(priority); } }; #endif