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
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.656 Beiträge
 
Delphi 12 Athens
 
#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.779 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.656 Beiträge
 
Delphi 12 Athens
 
#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
Antwort Antwort


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 00:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz