Ĺadny brzuch
Cześć. Napisałem taki prościutki programik, żeby sprawdzić, jak działa klasa TThread. Działa dziwnie - albo coś źle zrobiłem. Sprawa wygląda tak. Mam okienko, pole tekstowe (edit) i 3 przyciski. Pierwszy przycisk uruchamia wątek, drugi go pauzuje / wznawia, a trzeci zabija. Wątek działa tak, że zmienia tekst pola tekstowego edit. Wynik jest taki, że gdy zabijam wątek, to wyskakuje wielkie puste okienko, a cały program nie chce się zamknąć (muszę wchodzić w Run->Program reset).
Chciałbym przedstawić swoją wersję tego programiku i może ktoś będzie wiedział, czy coś jest źle.
najpierw plik watek.h
#ifndef watekH #define watekH //--------------------------------------------------------------------------- #include <Classes.hpp> //--------------------------------------------------------------------------- class watek : public TThread { private: int i; TEdit *edit; protected: void __fastcall Execute(); public: __fastcall watek(bool CreateSuspended); void __fastcall Init(TEdit *ed); void __fastcall Update(); }; //--------------------------------------------------------------------------- #endif
teraz plik watek.cpp (pominąłem 'includy' i wielki komentarz na początku, żeby nie zabierać miejsca)
__fastcall watek::watek(bool CreateSuspended) : TThread(CreateSuspended) { } //--------------------------------------------------------------------------- void __fastcall watek::Execute() { while(1) { i++; if(i == 10000) i = 0; if(i % 1000 == 0) Synchronize(&Update); if(Terminated) break; } ShowMessage("koniec"); Free(); } //--------------------------------------------------------------------------- void __fastcall watek::Init(TEdit *ed) { edit = ed; i = 0; } void __fastcall watek::Update() { edit->Text = i / 1000; }
wątek tworzę tak:
//plik program.h // ... private: watek *w; // ... //plik program.cpp - zawartość konstruktora w = new watek(true);
no a zdarzenia na kliknięcie przycisków wyglądają tak:
//pierwszy: w->Init(Edit1); w->Resume(); //drugi: if(Button2->Caption == "pauza") { w->Suspended = true; Button2->Caption = "wznów"; } else { w->Suspended = false; Button2->Caption = "pauza"; } //trzeci: w->Terminate();
To chyba tyle. Czy widzicie może coś bzdurnego w tym kodzie? Bardzo proszę o odpowiedzi i pozdrawiam!
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Chciałbym przedstawić swoją wersję tego programiku i może ktoś będzie wiedział, czy coś jest źle.
najpierw plik watek.h
#ifndef watekH #define watekH //--------------------------------------------------------------------------- #include <Classes.hpp> //--------------------------------------------------------------------------- class watek : public TThread { private: int i; TEdit *edit; protected: void __fastcall Execute(); public: __fastcall watek(bool CreateSuspended); void __fastcall Init(TEdit *ed); void __fastcall Update(); }; //--------------------------------------------------------------------------- #endif
teraz plik watek.cpp (pominąłem 'includy' i wielki komentarz na początku, żeby nie zabierać miejsca)
__fastcall watek::watek(bool CreateSuspended) : TThread(CreateSuspended) { } //--------------------------------------------------------------------------- void __fastcall watek::Execute() { while(1) { i++; if(i == 10000) i = 0; if(i % 1000 == 0) Synchronize(&Update); if(Terminated) break; } ShowMessage("koniec"); Free(); } //--------------------------------------------------------------------------- void __fastcall watek::Init(TEdit *ed) { edit = ed; i = 0; } void __fastcall watek::Update() { edit->Text = i / 1000; }
wątek tworzę tak:
//plik program.h // ... private: watek *w; // ... //plik program.cpp - zawartość konstruktora w = new watek(true);
no a zdarzenia na kliknięcie przycisków wyglądają tak:
//pierwszy: w->Init(Edit1); w->Resume(); //drugi: if(Button2->Caption == "pauza") { w->Suspended = true; Button2->Caption = "wznów"; } else { w->Suspended = false; Button2->Caption = "pauza"; } //trzeci: w->Terminate();
To chyba tyle. Czy widzicie może coś bzdurnego w tym kodzie? Bardzo proszę o odpowiedzi i pozdrawiam!