AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language WorkerThread.Execute arbeitet keine procedure ab ?
Thema durchsuchen
Ansicht
Themen-Optionen

WorkerThread.Execute arbeitet keine procedure ab ?

Ein Thema von MrMooed · begonnen am 30. Sep 2012 · letzter Beitrag vom 1. Okt 2012
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#1

WorkerThread.Execute arbeitet keine procedure ab ?

  Alt 30. Sep 2012, 20:31
Delphi-Version: 2007
'Nabend

Ich habe mich wegen eines Projektes mal an das Thema Multithreading gewagt

Nun habe ich das Problem, dass ich dem WorkerThread Parameter zum rechnen übergebe, aber sobald ich Worker.Resume auf 'True' setzte passiert garnichts. Kann es dadran liegen, dass ich in der .Execute eine andere procedure starte (die die eigentliche Berechnung durchführt) ?

Hier mal ein wenig Code:
Aufruf in main-unit:
Delphi-Quellcode:
procedure TForm1.Vollbild1Click(Sender: TObject);
var
  i: Integer;
  Thread: Array of WorkerThread;
begin
  SetLength(Thread, GetCPUCount);
  for i:=0 to Length(Thread)-1 do begin
    Thread[i] := WorkerThread.create(true);
    Thread[i].ThreadCount := GetCPUCount;
    Thread[i].Y_Min := Y_Min;
    Thread[i].Y_Max := Y_Max;
    Thread[i].X_Min := X_Min + i * (X_Min + X_Max) / GetCPUCount;
    Thread[i].X_Max := Thread[i].X_Min + i * (X_Min + X_Max) / GetCPUCount;
    Thread[i].Hoehe := Form1.Height;
    Thread[i].Breite := Form1.Width DIV GetCPUCount;
    Thread[i].Resume;
    end;
end
Bei der WorkerThread.Execute macht es keinen Unterschied ob ich die procedure damit aufrufe, oder ob ich sie direkt dadrin berechne o.o
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#2

AW: WorkerThread.Execute arbeitet keine procedure ab ?

  Alt 30. Sep 2012, 20:46
Wie sieht denn dein WorkerThread aus?
Lars
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#3

AW: WorkerThread.Execute arbeitet keine procedure ab ?

  Alt 1. Okt 2012, 14:21
Wie sieht denn dein WorkerThread aus?
Ist ein wenig lang, aber habe keine Ahnung ob / wie man hier einen Spoiler einfügt

Delphi-Quellcode:
unit mWorkerThread;

interface

uses
  classes, Graphics;

type
  WorkerThread = class(TThread)
  protected
    procedure Execute; override;
    procedure berechnePixel();
    function rechne(X_Ko, Y_Ko: double): Integer;
  public
    Bild : TBitMap;
    X_Min, Y_Min, X_Max, Y_Max: double;
    ThreadCount, Hoehe, Breite: Integer;
  end;

implementation

function WorkerThread.rechne(X_Ko, Y_Ko: double): Integer;
var
  i: Integer;
  nX, nY, X, Y, A: double;
begin
  i := 0;
  X := 0;
  Y := 0;
  while (i < 100) and (A < 4) do begin
    nX := (X*X) - (Y*Y) + X_Ko;
    nY := 2 * X * Y + Y_Ko;
    X := nX;
    Y := nY;
    A := X*X + Y*Y;
    Inc(i);
    end;
    result := i;
end;

procedure WorkerThread.berechnePixel();
var
   x, y: Integer;
   faktorX, faktorY, tmp: double;
begin
    x := 0;
    tmp := Y_Min;
    Bild := TBitMap.Create;
    Bild.Width := Hoehe;
    Bild.Height := Breite;
    faktorX := (Abs(x_Min)+Abs(x_Max)) / Bild.Width;
    faktorY := (Abs(y_Min)+Abs(y_Max)) / Bild.Height;
    while (x_Min <= x_Max) do begin
      y := 0;
      while (y_Min <= y_Max) do begin
        case rechne(x_Min, y_Min) of
          0..10: Bild.Canvas.Pixels[x,y] := clBlack;
          11..20: Bild.Canvas.Pixels[x,y] := clOlive;
          21..30: Bild.Canvas.Pixels[x,y] := clYellow;
          31..40: Bild.Canvas.Pixels[x,y] := clLime;
          41..50: Bild.Canvas.Pixels[x,y] := clGreen;
          51..60: Bild.Canvas.Pixels[x,y] := clAqua;
          61..70: Bild.Canvas.Pixels[x,y] := clBlue;
          71..80: Bild.Canvas.Pixels[x,y] := clNavy;
          81..90: Bild.Canvas.Pixels[x,y] := clPurple;
          else Bild.Canvas.Pixels[x,y] := $000000;
        end;
        y_Min := y_Min + faktorY;
        Inc(y);
      end;
      y_Min := tmp;
      x_Min := x_Min + faktorX;
      Inc(x);
    end;
end;

procedure WorkerThread.Execute;
begin
  berechnePixel;
end;

end.

Geändert von MrMooed ( 1. Okt 2012 um 14:51 Uhr)
  Mit Zitat antworten Zitat
daywalker9

Registriert seit: 1. Jan 2010
Ort: Leer
594 Beiträge
 
Delphi XE3 Professional
 
#4

AW: WorkerThread.Execute arbeitet keine procedure ab ?

  Alt 1. Okt 2012, 14:32
Hast Du denn schon mal einen BReakpoint in WorkerThread.Execute gesetzt, um zu schauen, ob Du da rein kommst?
Lars
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: WorkerThread.Execute arbeitet keine procedure ab ?

  Alt 1. Okt 2012, 14:34
Und wozu ist die Bitmap gut, die nur erzeugt, aber nirgends dargestellt/gespeichert/freigegeben wird?
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
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.754 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: WorkerThread.Execute arbeitet keine procedure ab ?

  Alt 1. Okt 2012, 14:37
In der Methode "darstellen", wie und wo soll denn da ewtas dargestellt werden.
Es wird ein Instanz von TBitmap erzeugt - mit dem Inhalt etwas angestellt/berechnet.
Das war es dann schon.
Die Instannz wird nicht freigegeben noch wird etwas zu Ausgabe gebracht.

Wenn Du etwas in Deiner Hauptform darstellen willst, solltest Du dich
mit critcal section und/oder synchronize beschäftigen.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: WorkerThread.Execute arbeitet keine procedure ab ?

  Alt 1. Okt 2012, 14:39
Sag ich doch
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
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#8

AW: WorkerThread.Execute arbeitet keine procedure ab ?

  Alt 1. Okt 2012, 14:45
also zunäschsteinmal hatte ich es mir so vorgestellt (deswegen wurde Bild public deklariert) dass ich mir in meiner Hauptunit das Bild hole, sobald der Thread suspended ist.
Freigegeben wird der Speicher doch sowieso, sobald der Thread terminiert wurde oder habe ich das falsch verstanden ?

Und mit dem Debugger bin ich trotz Haltepunkt nicht in dem Thread gelandet - er bekommt alle Atribute, aber startet dann einfach nicht

//Edit: ok 'darstellen' ist wirklich ein unpassender Name dafür, kam noch aus der Zeit wo ich einen Thread hatte der dann damit direkt gezeichnet hat. Werde es umbenennen.

Geändert von MrMooed ( 1. Okt 2012 um 14:50 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: WorkerThread.Execute arbeitet keine procedure ab ?

  Alt 1. Okt 2012, 15:00
Das "darstellen" sollte wohl eher sowas wie "(be)arbeiten" heißen.

PS: statt über das langame Delphi-Referenz durchsuchenTCanvas.Pixels zu gehn, könnte man sich eventuell auch mal mit Delphi-Referenz durchsuchenTCanvas.Scanline beschäftigen.
Jenachdem wie langsam/schnell das "rechne" ist, könnte man sich die Threads auch sparen.


Bezüglich deinem "rechne":
- Wo hast du denn A initialisiert?
Das sollte dir der Compiler auch melden (falls man sich mal die Compilermeldungen durchliest), denn du wertest das schon aus, noch bevor A einen definierten Wert hat.
Und ohne Initialisierung sind lokale Variablen potentiell erstmal mit Zufallswerten befüllt.

oder man stellt das ein bissl um (das A erst auswerten, nachdem es berechnet wurde, bzw. gleich die Auswertung und Berechnung zusammenlegen und sich A sparen)
Delphi-Quellcode:
function WorkerThread.rechne(X_Ko, Y_Ko: double): Integer;
var
  nX, nY, X, Y: double;
begin
  Result := 0;
  X := 0;
  Y := 0;
  repeat
    nX := Sqr(X) - Sqr(Y) + X_Ko;
    nY := 2 * X * Y + Y_Ko;
    X := nX;
    Y := nY;
    Inc(Result);
  until (Result >= 100) or (Sqr(X) + Sqr(Y) >= 4);
end;
[edit]
bissl lahm


Wird das Execute, laut Debugger, nicht sofort im ".Resume" ausgeführt, oder überhaupt nicht?
Der Thread wird (vorallem im Debugger) etwas verzägert gestartet.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu ( 1. Okt 2012 um 15:04 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von MrMooed
MrMooed

Registriert seit: 18. Feb 2012
101 Beiträge
 
Delphi 7 Enterprise
 
#10

AW: WorkerThread.Execute arbeitet keine procedure ab ?

  Alt 1. Okt 2012, 15:09
*Im Erdboden versink* - dachte dass ich es mir sparen kann zu initialisieren, da ihm ja direkt ein Wert zugewiesen wird .. aber vorher prüft er ja das A hätte bestimmt einiges an Zeit gebraucht um ein Fehlverhalten dadurch nachzuvollziehen

Jedenfalls habe ich immer noch keinen blassen Schimmer warum er den Thread nicht startet. Kann Delphi so schlau sein, dass es den Thread "wegoptimiert", da ich zu Testzwecken noch nicht auf WorkerThread.Bild zugreife Werde es mal testen

//Edit:
Wird das Execute, laut Debugger, nicht sofort im ".Resume" ausgeführt, oder überhaupt nicht?
Der Thread wird (vorallem im Debugger) etwas verzägert gestartet.
es wurde überhaupt nicht ausgeführt. Totenstille nach dem ich die Werte übergeben habe.
Und es scheint tatsächlich so zu sein, dass Delphi mir den Thread wegoptimiert hat, da ich das Bild nicht weiter benutzt habe - welch eine schlaue Software ich da doch benutze

Geändert von MrMooed ( 1. Okt 2012 um 15:19 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:24 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