Gå til innhold

Flere prosedyrer knyttet til samme event?


Anbefalte innlegg

Videoannonse
Annonse

Ja...

 

Sørg for å at eventen kaller en prosedyre som igjen kaller 3 andre for eksempel 8-).

 

Hvis du vil at de skal kjøre samtidig (noe som Delphi ikke gjør i noen tilfeller med mindre du ber om det: Threads), så bør du bruke threads.

 

 

 TMyThreadProcedure = procedure(A: Array of Pointer);

 TMyThread = class(TThread)
   Parameters: Array of Pointer;
   Proc: TMyThreadProcedure;
   constructor Create(ToExecute: TMyThreadProcedure; Params: Array of Pointer);
   procedure Execute;
 end;

constructor TMyThread.Create;
var
 temp: Integer;
begin
 inherited Create(True);

 setlength(Parameters,length(Params));
 for temp := low(Params) to high(Params) do
 begin
   Parameters[temp] := Params[temp];
 end;

 Proc := ToExecute;
end;

procedure TMyThread.Execute;
begin
 Proc(Parameters);
 Terminate; //Du vil kanskje bruke FreeThread istedet
end;

procedure Procedure1(A: Array of Pointer);
begin
 //Det du vil gjøre i Proc 1
end;

procedure Procedure2(A: Array of Pointer);
begin
 //Det du vil gjøre i Proc 2
end;

procedure Procedure3(A: Array of Pointer);
begin
 //Det du vil gjøre i Proc 3
end;

procedure somebuttonOnClick(Sender: TObject);
var
 loop: integer;
 threads: array[0..2] of TMyThread;
begin
 threads[0] := TThread.Create(Procedure1, []); //på insiden av [] parantesene, kan du selfølgelig legge til pointers til alt mulig som du vil passe over til prosedyren som kjører inn i den seperate threaden
 threads[1] := TThread.Create(Procedure2, []);
 threads[2] := TThread.Create(Procedure3, []);

 //Opprettinga av disse threadene tar nesten ikkeno tid, så nå starter Procedure1, 2, og 3 ganske på likt (yep, samtidig), mens hovedthreaden som tegner grafikk, osv, også kjører videre, så det blir ingen lags
end;

 

 

Eksempel på passing av parametere:

 ...
 SomeThread := TMyThread.Create(ProcessToRun,[PChar('en eller anne string')]);  //plasserer i minnet, og passerer en pointer til den i array index nr 0
 ...

procedure ProcessToRun(A: Array of Pointer);
begin
 ...
 form_main.Caption := String(A[0]); //her gjør vi pointeren tilbake til en normal string, og "assigner" den til form_main.Caption.
 ...
end;

Lenke til kommentar

Og, selfølgelig, vil du gjøre det etterhverandre (single tasking), så gjør du sånn:

 

procedure somebuttonOnClick(Sender: TObject);
begin
 Procedure1;  //med eventuelle parametere som ikke trenger å være array of pointer lenger ettersom det ikke bruker det universale thread systemet mitt. Hvertfall, først kjører Procedure1 seg heeelt ferdig

 Procedure2;  //så begynner procedure2, og holder på til den er ferdig
 Procedure3;  //så til siste begynner procedure3, og holder på til den er ferdig
end;

 

Med dette systemet, vil programmet ditt "henge" (og bli markert som "Not Responding" hvis for lenge) til alle er ferdige, ettersom du gjør alle oppgavene (som er tidskrevende?) i hovedthreaden til programmet.

Lenke til kommentar
Takker...

 

Kanskje like greit å bare lage en event til, som gjør det samme men har forskjellig navn... Så kan jeg kalle event1 og han andre kan kalle event2.

Yep, hvis det er du som har lagd komponenten.

 

Likevel, med mindre du lager Threads, eller legger til en komponent som bruker threads, kjører Delphi alltid events, og sånt i en thread. Vær forsiktig med å ha store prosedyrer inni de to eventene uten bruk av multithreading (det får det til å virke som om programmet har hengt seg opp).

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...