AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

THreads in ein Array schreiben

Ein Thema von bernhard_LA · begonnen am 22. Mär 2012 · letzter Beitrag vom 29. Mär 2012
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#11

AW: THreads in ein Array schreiben

  Alt 27. Mär 2012, 10:09
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.
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#12

AW: THreads in ein Array schreiben

  Alt 27. Mär 2012, 15:31
Habe die Antwort nicht ganz verstanden

wenn ich die Zeile tread.execute auskommentiere, rechnet der Thread aber nicht mehr.



------
http://radstudiodemos.svn.sourceforg...i/RTL/Threads/
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#13

AW: THreads in ein Array schreiben

  Alt 27. Mär 2012, 15:33
Dann schreib doch im Konstruktor (des Threads) als letzte Zeile "Start;" hin.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
flipdascript

Registriert seit: 20. Mai 2008
25 Beiträge
 
Delphi 2010 Professional
 
#14

AW: THreads in ein Array schreiben

  Alt 27. Mär 2012, 15:35
Falls Du den Thread suspended erstellt hast kannst Du ihn einfach mit Resume starten.
In dem Fall ersetze einfach aFastNCCThread.Execute; durch aFastNCCThread.Resume; .
Du kannst die Threads aber auch nicht suspended erstellen, dann rennen sie sofort nach ihrer Erstellung los.
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#15

AW: THreads in ein Array schreiben

  Alt 27. Mär 2012, 18:29
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
Miniaturansicht angehängter Grafiken
thread_problem.jpg  

Geändert von bernhard_LA (27. Mär 2012 um 18:39 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#16

AW: THreads in ein Array schreiben

  Alt 27. Mär 2012, 19:07
Wäre es nicht bequemer, auf etwas Fertiges wie z.B. Andreas' AsyncCalls oder die OmniThreadLibrabry zurückzugreifen?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Iwo Asnet

Registriert seit: 11. Jun 2011
313 Beiträge
 
#17

AW: THreads in ein Array schreiben

  Alt 27. Mär 2012, 19:20
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;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#18

AW: THreads in ein Array schreiben

  Alt 27. Mär 2012, 19:46
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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (27. Mär 2012 um 19:50 Uhr)
  Mit Zitat antworten Zitat
bernhard_LA

Registriert seit: 8. Jun 2009
Ort: Bayern
1.138 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: THreads in ein Array schreiben

  Alt 27. Mär 2012, 20:49
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#20

AW: THreads in ein Array schreiben

  Alt 27. Mär 2012, 20:56
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.

Geändert von himitsu (27. Mär 2012 um 20:58 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20: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