Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   THreads in ein Array schreiben (https://www.delphipraxis.net/167303-threads-ein-array-schreiben.html)

Bummi 27. Mär 2012 09:09

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.

bernhard_LA 27. Mär 2012 14:31

AW: THreads in ein Array schreiben
 
Habe die Antwort nicht ganz verstanden :oops:

wenn ich die Zeile
Delphi-Quellcode:
tread.execute
auskommentiere, rechnet der Thread aber nicht mehr.



------
http://radstudiodemos.svn.sourceforg...i/RTL/Threads/

DeddyH 27. Mär 2012 14:33

AW: THreads in ein Array schreiben
 
Dann schreib doch im Konstruktor (des Threads) als letzte Zeile "Start;" hin.

flipdascript 27. Mär 2012 14:35

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:
aFastNCCThread.Execute;
durch
Delphi-Quellcode:
aFastNCCThread.Resume;
.
Du kannst die Threads aber auch nicht suspended erstellen, dann rennen sie sofort nach ihrer Erstellung los.

bernhard_LA 27. Mär 2012 17:29

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:
   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;
, jeder erzeugte Thread berechnet auch eine TeilMatrix meines Problems, das Endergebnis ist richtig.
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

DeddyH 27. Mär 2012 18:07

AW: THreads in ein Array schreiben
 
Wäre es nicht bequemer, auf etwas Fertiges wie z.B. Andreas' AsyncCalls oder die OmniThreadLibrabry zurückzugreifen?

Iwo Asnet 27. Mär 2012 18:20

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;

himitsu 27. Mär 2012 18:46

AW: THreads in ein Array schreiben
 
Zitat:

Zitat von bernhard_LA (Beitrag 1158957)
mein Problem besteht darin, ich kann in meiner Schleife i Threads erzeugen
Delphi-Quellcode:
   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;

Nein, dein Problem ist, daß du nicht lesen kannnt.

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;

bernhard_LA 27. Mär 2012 19:49

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

himitsu 27. Mär 2012 19:56

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 Delphi-Referenz durchsuchenTThread.Resume Delphi-Referenz durchsuchenTThread.Start der Thread gestartet.
Wenn der Thread anläuft, dann ruft dieser das Execute auf und führt es in seinem Kontext aus.

Zitat:

bin beim Design der Klasse nach ...
Nicht nur beim Design der Klasse danach vorgehn, sondern auch danach, wie die Klasse dort verwendet wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:33 Uhr.
Seite 2 von 3     12 3      

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