frenzy81 Skrevet 28. juni 2004 Del Skrevet 28. juni 2004 Heisann Jeg og en til har støtt på et problem da vi begge har assignet våre egne metoder til samme event i et program vi utvikler. Går det an å assigne flere prosedyrer til samme event? Lenke til kommentar
ChrML Skrevet 28. juni 2004 Del Skrevet 28. juni 2004 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
ChrML Skrevet 28. juni 2004 Del Skrevet 28. juni 2004 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
frenzy81 Skrevet 28. juni 2004 Forfatter Del Skrevet 28. juni 2004 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. Lenke til kommentar
ChrML Skrevet 28. juni 2004 Del Skrevet 28. juni 2004 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
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå