AGB  ·  Datenschutz  ·  Impressum  







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

Threads und die Zählvariable

Ein Thema von SiD · begonnen am 2. Dez 2004 · letzter Beitrag vom 3. Dez 2004
Antwort Antwort
SiD

Registriert seit: 17. Jul 2003
52 Beiträge
 
#1

Threads und die Zählvariable

  Alt 2. Dez 2004, 20:05
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!!!!!!!!
Angehängte Dateien
Dateityp: zip thread_101.zip (2,6 KB, 12x aufgerufen)
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#2

Re: Threads und die Zählvariable

  Alt 2. Dez 2004, 20:10
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.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
BKempf

Registriert seit: 1. Jun 2004
103 Beiträge
 
Delphi 6 Enterprise
 
#3

Re: Threads und die Zählvariable

  Alt 2. Dez 2004, 20:18
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.
The problem with troubleshooting is that sometimes the trouble shoots back.
  Mit Zitat antworten Zitat
SiD

Registriert seit: 17. Jul 2003
52 Beiträge
 
#4

Re: Threads und die Zählvariable

  Alt 2. Dez 2004, 20:30
Danke erstmal für die Antworten!
Leider kennt der Compiler InterlockedIncrement() nicht in der untThread?????
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#5

Re: Threads und die Zählvariable

  Alt 2. Dez 2004, 20:36
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.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
SiD

Registriert seit: 17. Jul 2003
52 Beiträge
 
#6

Re: Threads und die Zählvariable

  Alt 2. Dez 2004, 20:56
1000…Dank, hat bestens funktioniert!
Besteht eigentlich eine Möglichkeit zu erfahren wenn der Compiler fertig ist?
  Mit Zitat antworten Zitat
Benutzerbild von Sprint
Sprint

Registriert seit: 18. Aug 2004
Ort: Edewecht
712 Beiträge
 
Delphi 5 Professional
 
#7

Re: Threads und die Zählvariable

  Alt 2. Dez 2004, 21:02
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.
Ciao, Sprint.

"I don't know what I am doing, but I am sure I am having fun!"
  Mit Zitat antworten Zitat
SiD

Registriert seit: 17. Jul 2003
52 Beiträge
 
#8

Re: Threads und die Zählvariable

  Alt 2. Dez 2004, 21:13
wenn der Thread fertig ist, aber beim Createn habe ich
FreeOnTerminate := True; gesetzt kann ich trotzdem OnTerminate verwenden?
  Mit Zitat antworten Zitat
Benutzerbild von Pr0g
Pr0g

Registriert seit: 21. Mai 2004
809 Beiträge
 
Delphi 7 Personal
 
#9

Re: Threads und die Zählvariable

  Alt 2. Dez 2004, 21:26
Zitat von SiD:
wenn der Thread fertig ist, aber beim Createn habe ich
FreeOnTerminate := True; gesetzt kann ich trotzdem OnTerminate verwenden?
Ja:

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
  Mit Zitat antworten Zitat
SiD

Registriert seit: 17. Jul 2003
52 Beiträge
 
#10

Re: Threads und die Zählvariable

  Alt 3. Dez 2004, 13:05
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!!!!

Danke im Voraus!
  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 03:08 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