Hallo,
ich hab mich mit Parallelisierung ein wenig befasst. Hab jetzt ein Demo Programm das eine Funktion auf 4 Kerne aufteilt.
Jetzt hab ich mir gedacht, ich tuhe das in einer eigenen Unit und einer eigenen Klasse reinpacken.
Blos ich bekomme ich ThreadFunc in meiner Klasse nicht gestartet, weil die Funktion keine Variable mehr ist.
Die Suche hat nichts gebracht, nur Müll in der Suche gekommen.
So sieht mein Code aus:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14:
| type TQuadThreadingExampleClass = class private LocalVariables: TExampleWorking; function Thread1:Integer; function Thread2:Integer; function Thread3:Integer; function Thread4:Integer; function ThreadFunc(tp: PQuadThreadingExampleInformation): Integer; public procedure Run; published
end; |
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| function TQuadThreadingExampleClass.ThreadFunc(tp: PQuadThreadingExampleInformation): Integer; var Number: Integer; begin Number := PQuadThreadingExampleInformation(tp)^.Number;
if Number = 1 then begin Thread1; end; if Number = 2 then begin Thread2; end; if Number = 3 then begin Thread3; end; if Number = 4 then begin Thread4; end; result := 0; end; |
Aufrufen tuhe ich jetzt ThreadFunc so:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41:
| procedure TQuadThreadingExampleClass.Run; var tp1, tp2, tp3, tp4: PQuadThreadingExampleInformation; Thread1, Thread2, Thread3, Thread4: THandle; ThreadID1, ThreadID2, ThreadID3, ThreadID4: Cardinal; begin New(tp1); New(tp2); New(tp3); New(tp4);
tp1.Number := 1; tp2.Number := 2; tp3.Number := 3; tp4.Number := 4;
Thread1 := BeginThread(nil, 0, @ThreadFunc, tp1, 0, ThreadID1);
Thread2 := BeginThread(nil, 0, @ThreadFunc, tp2, 0, ThreadID2);
Thread3 := BeginThread(nil, 0, @ThreadFunc, tp3, 0, ThreadID3);
Thread4 := BeginThread(nil, 0, @ThreadFunc, tp4, 0, ThreadID4);
WaitForSingleObject(Thread1, INFINITE); WaitForSingleObject(Thread2, INFINITE); WaitForSingleObject(Thread3, INFINITE); WaitForSingleObject(Thread4, INFINITE);
Dispose(tp1); Dispose(tp2); Dispose(tp3); Dispose(tp4); end; |
Das Problem ist, das er die makierte Stelle nicht akzeptiert.
Wenn ich die ThreadFunc Funktion so ändere:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20:
| function [s]TQuadThreadingExampleClass.[/s]ThreadFunc(tp: PQuadThreadingExampleInformation): Integer; var Number: Integer; begin Number := PQuadThreadingExampleInformation(tp)^.Number;
if Number = 1 then begin Thread1; end; if Number = 2 then begin Thread2; end; if Number = 3 then begin Thread3; end; if Number = 4 then begin Thread4; end; result := 0; end; |
Akzeptiert er zwar die Zeile, kann aber Thread1,Thread2,Thread3 und Thread4 net aufrufen.
Gibt es eine Lösung das er es trotzdem schluckt?
So weit ich weiß, gibt es noch eine andere Möglichkeit Threads zu starten, aber diese Möglichkeit finde ich einfacher.
Danke schonmal im Vorraus.