AW: THreads in ein Array schreiben
Auf die Art wird das Execute im Kontext des Hauptthreads ausgeführt, wie eine normale Prozedur.
Der Thread ruft nach dem starten intern Execute auf, ein Aufruf von außen macht keinen Sinn. |
AW: THreads in ein Array schreiben
Habe die Antwort nicht ganz verstanden :oops:
wenn ich die Zeile
Delphi-Quellcode:
auskommentiere, rechnet der Thread aber nicht mehr.
tread.execute
------ http://radstudiodemos.svn.sourceforg...i/RTL/Threads/ |
AW: THreads in ein Array schreiben
Dann schreib doch im Konstruktor (des Threads) als letzte Zeile "Start;" hin.
|
AW: THreads in ein Array schreiben
Falls Du den Thread suspended erstellt hast kannst Du ihn einfach mit Resume starten.
In dem Fall ersetze einfach
Delphi-Quellcode:
durch
aFastNCCThread.Execute;
Delphi-Quellcode:
.
aFastNCCThread.Resume;
Du kannst die Threads aber auch nicht suspended erstellen, dann rennen sie sofort nach ihrer Erstellung los. |
AW: THreads in ein Array schreiben
Liste der Anhänge anzeigen (Anzahl: 1)
mein Problem besteht darin, ich kann in meiner Schleife i Threads erzeugen
Delphi-Quellcode:
, jeder erzeugte Thread berechnet auch eine TeilMatrix meines Problems, das Endergebnis ist richtig.
for i:= 0 to Anzahl Threads do
aThread := TMyThread.Create( Übergabe der Ausgangsmatrizen, Überhabe der Ergbnismatrix); aThread.Execute // Berechne hier eine Teilmatrix und dann das Ergebnis in die große Matrix schreiben end; leider Ist die Zeit für die Berechnung der Matrizen ohne Threads genauso lange wie für die Berechnung der Matrizen mit 8 Threads auf einem System mit 4 Cores. Meine Erwartung : T _Threads ~ T_Ohne_Threads / Anzahl_der_Threads. Ich frage mich halt ob der Code auf die Abarbeitung von thread.execute wartet, die Parallelberechnung klappt irgendwie nicht |
AW: THreads in ein Array schreiben
Wäre es nicht bequemer, auf etwas Fertiges wie z.B. Andreas' AsyncCalls oder die OmniThreadLibrabry zurückzugreifen?
|
AW: THreads in ein Array schreiben
So geht das!
Delphi-Quellcode:
for i:= 0 to Anzahl Threads do
TMyThread.Create( Übergabe der Ausgangsmatrizen, Überhabe der Ergbnismatrix); ... ... Constructior TMyThread.Create (...params); Begin inherited Create(False); FreeOnTerminate := True; ... initialize your Ausgangsmatrizen and stuff Resume; // Nicht nötig, aber lesbar End; |
AW: THreads in ein Array schreiben
Zitat:
Dir wurde mehrmals gesagt, daß man Execute nicht aufruft. (wird auch in jedem Thread-Tutorial erklärt) PS: Execute ist mit Absicht als Protected deklariert, damit sollte eigentlich klar werden, daß man dieses nicht von extern aufruft. Wobei ich die Möglichkeiten der Generics und anonymen Methoden sehr zu schätzen lernte.
Delphi-Quellcode:
TThread.CreateAnonymousThread(procedure
begin ... // läuft in einem Thread ... TThread.Synchronize(nil, procedure begin ... // läuft im Hautthread/VCL-Thread ... end); ... // läuft in einem Thread ... TThread.Synchronize(nil, procedure var i: Integer; begin ... // läuft im Hautthread/VCL-Thread for i := 0 to ... ... end); ... // läuft in einem Thread ... end).Start; |
AW: THreads in ein Array schreiben
meine Leitung ist wohl ziemlich lang ... :(
aber : bin beim Design der Klasse nach http://wiki.delphigl.com/index.php/T...Multithreading vorgegangenm dort ist ja auch in Thread.execute der Code für die Berechnung eingetragen Habe mal den ganzen Code aus der Procedure Execute bereits in die Procedure Create verschoben und rufe dann Thread.execute in der Schleife nicht mehr auf. Das Endergebnis ist wieder richtig, nur sehr ich keinen Geschwindigkeitsgewinn |
AW: THreads in ein Array schreiben
Nochmal für Langsame.
In Create kommt alles, was außerhalb des Threads initialisiert wird. In Excecute kommt der Code, welcher im Thread ausgeführt werden soll. Und hast du dort (siehe deine verlinkte Seite) irgendwo gesehn, daß irgendwer die Methode Execute aufruft? Nein! Im Create (wenn nicht Suspended) wird der Thread gestartet. Wenn Suspended, dann wird beim TThread.Resume TThread.Start der Thread gestartet. Wenn der Thread anläuft, dann ruft dieser das Execute auf und führt es in seinem Kontext aus. Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz