Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Threads und die Zählvariable (https://www.delphipraxis.net/35105-threads-und-die-zaehlvariable.html)

SiD 2. Dez 2004 19:05


Threads und die Zählvariable
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Leute,

könnte mir einer mit meinem Thread weiterhelfen? Mein Problem:
Eine Schleife soll 300 mal aufgerufen werden, es sind drei Threads die sich die Arbeit teilen sollen, leider läuft jeder Thread 300 mal…..Hilfe! :?:

Danke im Voraus!!!!!!!!

Sprint 2. Dez 2004 19:10

Re: Threads und die Zählvariable
 
Du musst deine Zählvariable global deklarieren. Also aus dem Private rausnehmen. Und anstatt Inc benutzt du dann InterlockedIncrement um die Variable hochzuzählen. Und ersetzt wihle <> i durch einen sinnvollen vergleich.

BKempf 2. Dez 2004 19:18

Re: Threads und die Zählvariable
 
Jeder der Threads besitzt eine eigene Variable (i1, ..., i3), die aber vom Vergleich "i<>300" nicht beachtet wird. Das "i" ist Attribut jeder der drei Instanzen der Unterklassen von TThreadObject, eine implizite Umbenennung oder impliziter Zugriff auf z.B. i2 wo nur i steht, findet nicht statt.
Ich würde das so lösen, daß ich jedem TThreadObject noch einen Index (1..3) mitgebe, bevor er ausgeführt wird. 1 bedeutet 1-100, 2 101-200, 3 201-300. Die separaten Unterklassen würde ich wegwerfen, weil sie keine wirklich neue Funktion bringen.

SiD 2. Dez 2004 19:30

Re: Threads und die Zählvariable
 
Danke erstmal für die Antworten! :)
Leider kennt der Compiler InterlockedIncrement() nicht in der untThread?????

Sprint 2. Dez 2004 19:36

Re: Threads und die Zählvariable
 
Zitat:

Zitat von SiD
Leider kennt der Compiler InterlockedIncrement() nicht in der untThread?????

Das ist eine WinAPI Funktion die in der Unit Windows deklariert ist.

Ein Beispiel wie das aussehen könnte:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
    Thread1: TThread;
    Thread2: TThread;
    Thread3: TThread;
  public
    { Public-Deklarationen }
  end;

type
  TDownloadThread = class(TThread)
  private
    FLabel: TLabel;
    FInternalCounter: Integer;
    procedure UpdateLabel;
  protected
    procedure Execute; override;
  public
    constructor Create(ALabel: TLabel);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

var
  DownloadCounter: Integer;

constructor TDownloadThread.Create(ALabel: TLabel);
begin
  inherited Create(True);
  FLabel := ALabel;
end;

procedure TDownloadThread.UpdateLabel;
begin
  FLabel.Caption := IntToStr(FInternalCounter);
end;

procedure TDownloadThread.Execute;
begin
  FInternalCounter := InterlockedIncrement(DownloadCounter);
  while (not Terminated) and (FInternalCounter <= 300) do
  begin
    Synchronize(UpdateLabel);
    Sleep(500);
    FInternalCounter := InterlockedIncrement(DownloadCounter);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin

  Thread1 := TDownloadThread.Create(Label1);
  with Thread1 do
  begin
    FreeOnTerminate := True;
    Priority := tpIdle;
    Resume;
  end;

  Thread2 := TDownloadThread.Create(Label2);
  with Thread2 do
  begin
    FreeOnTerminate := True;
    Priority := tpIdle;
    Resume;
  end;

  Thread3 := TDownloadThread.Create(Label3);
  with Thread3 do
  begin
    FreeOnTerminate := True;
    Priority := tpIdle;
    Resume;
  end;

end;

procedure TForm1.Button2Click(Sender: TObject);
begin

  Thread1.Terminate;
  Thread2.Terminate;
  Thread3.Terminate;

end;

end.

SiD 2. Dez 2004 19:56

Re: Threads und die Zählvariable
 
1000…Dank, hat bestens funktioniert! :-D
Besteht eigentlich eine Möglichkeit zu erfahren wenn der Compiler fertig ist?

Sprint 2. Dez 2004 20:02

Re: Threads und die Zählvariable
 
Zitat:

Zitat von SiD
Besteht eigentlich eine Möglichkeit zu erfahren wenn der Compiler fertig ist?

Compiler? Oder meinst du wann der Thread fertig ist?

TThread hat ein Ereignis das OnTerminate heißt. Das kannst du verwenden. Außerdem hast du noch die Möglichkeit selber Funktionen einzubauen, wann ein Download abgearbeitet ist.

SiD 2. Dez 2004 20:13

Re: Threads und die Zählvariable
 
wenn der Thread fertig ist, aber beim Createn habe ich
FreeOnTerminate := True; gesetzt kann ich trotzdem OnTerminate verwenden?

Pr0g 2. Dez 2004 20:26

Re: Threads und die Zählvariable
 
Zitat:

Zitat von SiD
wenn der Thread fertig ist, aber beim Createn habe ich
FreeOnTerminate := True; gesetzt kann ich trotzdem OnTerminate verwenden?

Ja:

Zitat:

Zitat von OH
Das Ereignis OnTerminate wird ausgelöst, sobald die Methode Execute des Threads zurückgekehrt ist, aber bevor der Thread freigegeben wird.

MfG Pr0g

SiD 3. Dez 2004 12:05

Re: Threads und die Zählvariable
 
Könnte mir vielleicht einer das in einem Beispiel zeigen, wie ich prüfen kann ob alle Threads fertig sind? Das währe echt nett!!!! :lol:

Danke im Voraus!


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:54 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