Ciao a tutti:
ho scritto questo piccolo thread per la mia applicazione; serve per far lampeggiare una label (visibile/ invisibile):
TBlinker = class(TThread)
private
ftLabel: TLabel;
procedure setComponentLabel(AValue: TLabel);
protected
procedure Execute; override;
public
ctrVar: Boolean;
constructor Create(CreateSuspended: boolean);
property setLabel: TLabel read ftLabel write setComponentLabel;
procedure reverseBlink;
end;
procedure TBlinker.setComponentLabel(AValue: TLabel);
begin
if ftLabel=AValue then Exit;
ftLabel:=AValue;
end;
procedure TBlinker.reverseBlink;
begin
ftLabel.Visible:= not ftLabel.Visible;
end;
procedure TBlinker.Execute;
var
i: Integer;
begin
while not Terminated and (ctrVar = true) do
begin
Synchronize(@reverseBlink);
Sleep(500);
end;
end;
constructor TBlinker.Create(CreateSuspended: boolean);
begin
FreeOnTerminate := True;
inherited Create(CreateSuspended);
ctrVar:=true;
end;
In seguito ho dichiarato come globale un bel puntatore alla TBlinker:
Ho dichiarato un funzione per la creazione del thread:
function TFormMain.createBlinker: Boolean;
var
bp: TBlinker;
begin
try
bp := TBlinker.Create(true);
pnt_blinker := @bp;
bp.setComponentLabel(Label1);
bp.FreeOnTerminate:= true;
bp.Start;
finally
end;
end;
In un altro bottone avrei voluto stoppare il thread utilizzando pnt_blinker, ma il thread parte e vedo lampeggiare la scritta ma
se lo vado a sospendere per esempio con TBlinker(pnt_blinker).ctrVar:=false;
, cioè facendo terminare il thread con la
variabile di controllo del ciclo, ma anche con i metodi terminate del thread, il thread non si ferma.
Dove sto sbagliando?
dunque si io ho usato nel sorgente del progetto
{$ifdef unix}
cthreads,
cmem,
{$endif}
infatti su raspbian dava errore.
Si funziona; la mia intenzione era in pratica creare una variabile locale della funzione per poi assegnargli un puntatore da gestire ovunque, ma alla fine del thread nel finally, viene eliminato e quindi ho un errore.
In c avevo avuto un problema simile, cioè ho creato una funzione che mi tornava un puntatore a una struct che al suo interno aveva puntatori a funzione, quindi con il malloc e il sizeof creava quello a tutti gli effetti è un oggetto, ma se lanciavo il programma da debug del codeblock nella fattispecie funzionava in release no. Ho settato la funzione come static e dopo mi tornava correttamente l'oggetto creato dalla funzione. La gestione della memoria in lazarus è differente devo ripassare per bene.
Grazie ancora e per informazione una lettura interessante è https://www.codementor.io/michaelsafyan/object-oriented-programming-in-c-du1081gw2 (https://www.codementor.io/michaelsafyan/object-oriented-programming-in-c-du1081gw2)