// esitellään jossain meidän oma säieluokka Type TMyThread = class(TThread) public data: String; procedure Execute: Override; end;
procedure TMyThread.Execute; var idx: Integer; begin // tämä funktio ajetaan omassa säikeessä. Täältä ei saa päivittää // lomakkeen VCL komponentteja suoraan koska saattaa tulla // konflikti MainUI säikeen kanssa. for idx:=0 to to 10 do begin sleep(1000); // esimerkissä nukutaan jonkin aikaa end; end;
- - - - - // käytetään säiettä vaikka päälomakkeella
procedure TFrmMain.ThreadTerminated(Sender: TObject); var data: String; begin // säie lopettanut elämänsä, luetaan siitä lopputulos tai // mitä ohjelma haluaakin tehdä. Tätä kutsutaan MainUI // säikeessä joten on turvallista päivittää vaikka // formien VCL komponenttien tilatietoja. data := (Sender as TMyThread).data; end;
procedure TFrmMain.btnStartThread(Sender: TObject); var thr1: TMyThread; begin // luo instanssi mutta älä käynnistä(suspended=true) automaattisesti. // instanssin konstruktoria (free) kutsutaan automaattisesti kun // säikeen elinkaari päättyy. Ennen destruktoria kutsutaan ThreadTerminated // funktiota jossa voidaan tehdä lopputemput. thr1 := TMyThread.Create(true); thr1.freeOnTerminate := true; thr1.onTerminate := ThreadTerminated; thr1.Resume; // käynnistää säikeen // eli meidän ei tarvitse eikä saa kutsua täällä thr1.Free funktiota koska // järjestelmä poistaa sen automaattisesti. Jätetään se pyörimään taustalle. end;
Vastaukset 1
Vanhimmat
// esitellään jossain meidän oma säieluokka
Type
TMyThread = class(TThread)
public
data: String;
procedure Execute: Override;
end;
procedure TMyThread.Execute;
var
idx: Integer;
begin
// tämä funktio ajetaan omassa säikeessä. Täältä ei saa päivittää
// lomakkeen VCL komponentteja suoraan koska saattaa tulla
// konflikti MainUI säikeen kanssa.
for idx:=0 to to 10 do begin
sleep(1000); // esimerkissä nukutaan jonkin aikaa
end;
end;
- - - - -
// käytetään säiettä vaikka päälomakkeella
procedure TFrmMain.ThreadTerminated(Sender: TObject);
var
data: String;
begin
// säie lopettanut elämänsä, luetaan siitä lopputulos tai
// mitä ohjelma haluaakin tehdä. Tätä kutsutaan MainUI
// säikeessä joten on turvallista päivittää vaikka
// formien VCL komponenttien tilatietoja.
data := (Sender as TMyThread).data;
end;
procedure TFrmMain.btnStartThread(Sender: TObject);
var
thr1: TMyThread;
begin
// luo instanssi mutta älä käynnistä(suspended=true) automaattisesti.
// instanssin konstruktoria (free) kutsutaan automaattisesti kun
// säikeen elinkaari päättyy. Ennen destruktoria kutsutaan ThreadTerminated
// funktiota jossa voidaan tehdä lopputemput.
thr1 := TMyThread.Create(true);
thr1.freeOnTerminate := true;
thr1.onTerminate := ThreadTerminated;
thr1.Resume; // käynnistää säikeen
// eli meidän ei tarvitse eikä saa kutsua täällä thr1.Free funktiota koska
// järjestelmä poistaa sen automaattisesti. Jätetään se pyörimään taustalle.
end;