![]() |
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!!!!!!!! |
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.
|
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. |
Re: Threads und die Zählvariable
Danke erstmal für die Antworten! :)
Leider kennt der Compiler InterlockedIncrement() nicht in der untThread????? |
Re: Threads und die Zählvariable
Zitat:
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. |
Re: Threads und die Zählvariable
1000…Dank, hat bestens funktioniert! :-D
Besteht eigentlich eine Möglichkeit zu erfahren wenn der Compiler fertig ist? |
Re: Threads und die Zählvariable
Zitat:
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. |
Re: Threads und die Zählvariable
wenn der Thread fertig ist, aber beim Createn habe ich
FreeOnTerminate := True; gesetzt kann ich trotzdem OnTerminate verwenden? |
Re: Threads und die Zählvariable
Zitat:
Zitat:
|
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 15:27 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