Ĺadny brzuch
Witam wszystkich :)
Borykam się z moją niewiedzą, a mianowicie:
chodzi o sprawdzenie wstrzymania lub zakończenia wątku w kodzie c++ builder.
W delphi dało się mniej więcej tak:
unit Unit1;
//[..]
type
TWatek = class(TThread)
protected
procedure Execute; override;
procedure Aktualizuj;
end;
//[..]
public
Watek : TWatek;
end;
//[..]
implementation
{$R *.dfm}
procedure TWatek.Aktualizuj;
begin
//[..]
end;
procedure TWatek.Execute;
begin
FreeOnTerminate:=TRUE;
while not Terminated do
begin
Synchronize(Aktualizuj);
Sleep(1000);
end;
end;
procedure TForm1.PauzaClick(Sender: TObject);
begin
if not Watek.Terminated then
begin
if Watek.Suspended then Watek.Resume else Watek.Suspend;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Watek:=TWatek.Create(FALSE);
Watek.Priority:=tpNormal;
end;
end.
Natomiast nie wiem jak zrobić to sprawdzenie w C++B
Poradziłem sobie ukrywając jeden i pokazując drugi przycisk,
ale nie jest to to samo.
__fastcall TWatek1::TWatek1(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
TWatek1 *SecondThread = new TWatek1(false);
void __fastcall TWatek1::Aktualizuj(void)
{
SecondThread->Priority = tpLower;
//coś tam
}
void __fastcall TWatek1::Execute()
{
FreeOnTerminate=true;
while (!Terminated)
{
Synchronize(Aktualizuj);
Sleep(500);
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SecondThread->Suspend();
Form1->Button1->Visible=false;
Form1->Button3->Caption="Przywróć";
Form1->Button3->Visible=true;
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
SecondThread->Resume();
Form1->Button3->Visible=false;
Form1->Button1->Caption="Wstrzymaj";
Form1->Button1->Visible=true;
}
Jak należało by sprawdzić w tym przypadku stan wątku ?
Coś w stylu
if (SecondThread->!Terminated) { }
albo
if (SecondThread->Terminated == false) { }
wywala błąd, nie daje się skompilować.
wywala błąd, nie daje się skompilować.
Przy definicji klasy powinieneś mieć tak:class TWatek1:public TThread, a w niej:__property Terminated;.if (!SecondThread->Terminated) if (SecondThread->Suspended) SecondThread->Suspend(); else SecondThread->Resume();
__property Terminated;
Niewątpliwie o to chodziło!
Dziękuję za błyskawiczną odpowiedź :)
zanotowane.pl doc.pisz.pl pdf.pisz.pl zsf.htw.pl
Borykam się z moją niewiedzą, a mianowicie:
chodzi o sprawdzenie wstrzymania lub zakończenia wątku w kodzie c++ builder.
W delphi dało się mniej więcej tak:
unit Unit1;
//[..]
type
TWatek = class(TThread)
protected
procedure Execute; override;
procedure Aktualizuj;
end;
//[..]
public
Watek : TWatek;
end;
//[..]
implementation
{$R *.dfm}
procedure TWatek.Aktualizuj;
begin
//[..]
end;
procedure TWatek.Execute;
begin
FreeOnTerminate:=TRUE;
while not Terminated do
begin
Synchronize(Aktualizuj);
Sleep(1000);
end;
end;
procedure TForm1.PauzaClick(Sender: TObject);
begin
if not Watek.Terminated then
begin
if Watek.Suspended then Watek.Resume else Watek.Suspend;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Watek:=TWatek.Create(FALSE);
Watek.Priority:=tpNormal;
end;
end.
Natomiast nie wiem jak zrobić to sprawdzenie w C++B
Poradziłem sobie ukrywając jeden i pokazując drugi przycisk,
ale nie jest to to samo.
__fastcall TWatek1::TWatek1(bool CreateSuspended)
: TThread(CreateSuspended)
{
}
TWatek1 *SecondThread = new TWatek1(false);
void __fastcall TWatek1::Aktualizuj(void)
{
SecondThread->Priority = tpLower;
//coś tam
}
void __fastcall TWatek1::Execute()
{
FreeOnTerminate=true;
while (!Terminated)
{
Synchronize(Aktualizuj);
Sleep(500);
}
}
void __fastcall TForm1::Button1Click(TObject *Sender)
{
SecondThread->Suspend();
Form1->Button1->Visible=false;
Form1->Button3->Caption="Przywróć";
Form1->Button3->Visible=true;
}
void __fastcall TForm1::Button3Click(TObject *Sender)
{
SecondThread->Resume();
Form1->Button3->Visible=false;
Form1->Button1->Caption="Wstrzymaj";
Form1->Button1->Visible=true;
}
Jak należało by sprawdzić w tym przypadku stan wątku ?
Coś w stylu
if (SecondThread->!Terminated) { }
albo
if (SecondThread->Terminated == false) { }
wywala błąd, nie daje się skompilować.
wywala błąd, nie daje się skompilować.

Przy definicji klasy powinieneś mieć tak:class TWatek1:public TThread, a w niej:__property Terminated;.if (!SecondThread->Terminated) if (SecondThread->Suspended) SecondThread->Suspend(); else SecondThread->Resume();
__property Terminated;
Niewątpliwie o to chodziło!
Dziękuję za błyskawiczną odpowiedź :)