![]() |
Zuweisen unterschiedlicher Aufgabe für Threads
hallo =),
ich arbeite zur zeit noch immer an einem programm das mit hilfe von threads mehrere abläufe gleichzeitig erledigt. diese threads arbeiten zur zeit leider immer nur ein und die selbe aufgabe ab, dies könnte ich natürlich beim erzeugen der threads verhinden, allerdings wäre dann die anzahl der aufgaben auf die anzahl der threads begrenzt. ich möchte daher ein globales array erzeugen und einen zeiger der immer auf das nächste element im array verweist, damit die threads dieses array bis zum ende abarbeiten nun hab ich mir folgenden code zusammen gebastelt, der zwar keinen fehler erzeugt aber den zeiger auf das array nicht erhöht ersteinmal die unit für die threads:
Delphi-Quellcode:
und nun die unit 1
unit Unit2;
interface uses Classes, SysUtils, IdComponent, IdTCPConnection, IdTCPClient; type TMyThreads = class(TThread) private procedure UpDateCounter; procedure LunchThread; ... public FCounter: Integer; ... implementation uses Unit1; procedure TMyThreads.Execute; begin FCounter:= FCounter+1; Synchronize(UpdateCounter); LunchThread; end; ... procedure TMyThreads.UpDateCounter; begin MainForm.ArrayPointer := FCounter; end;
Delphi-Quellcode:
unit Unit1;
interface uses Windows, Messages, SysUtils, Classes, Controls, Forms, StdCtrls, ComCtrls, Unit2, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IniFiles; type TMainForm = class(TForm) ... public { Public-Deklarationen } ArrayPointer: Integer; procedure UpdateCounter(Counter: integer); ... implementation procedure TMainForm.UpdateCounter(Counter: integer); begin ArrayPointer := Counter; end; hat jemand vielleicht ein vorschlag wie man soetwas besser lösen kann bzw findet den fehler? mfg |
Re: Zuweisen unterschiedlicher Aufgabe für Threads
finde deine beschreibung etwas schwammig, glaube aber dass FCounter keine TThread-Variable sein sollte, sondern eine Unit-Variable. Dann sollte allerdings auch die Addition synchronisiert werden.
Lies mal das Buch "Delphi in a nutshell" vom O'Reilly-Verlag, dort wird Thread-Programmierung beschrieben. |
Re: Zuweisen unterschiedlicher Aufgabe für Threads
Zitat:
aus einem array gefüttert werden sollen, jeder thread soll dann jeweils einen wert aus dem array nutzen um seine aufgabe zu erfüllen, das ganze dann so lange bis alle elemente im array abgearbeitet wurden, d.h. bei 50 threads und 150 werten im array muss jeder thread 3 werte abarbeiten |
Re: Zuweisen unterschiedlicher Aufgabe für Threads
Wenn du FCounter dort lassen willst, wo er jetzt ist musst du ihn auf jeden Fall beim erstellen eines Threads initialisieren, zum Beispeil durch übergabe des aktuellen ArrayPointer als Parameter im Create.
|
Re: Zuweisen unterschiedlicher Aufgabe für Threads
aber im normalfall ist doch jede variable mit dem wert 0 initialisiert,
wenn ich mich jetzt richtig erinner |
Re: Zuweisen unterschiedlicher Aufgabe für Threads
In deinem Fall fängt jeder Thread bei Index 0 an. Solange also der Sync nicht erfolgt arbeiten alle Threads den gleichen Eintrag ab. Besser wäre hier eine Art Queue (Qarteschlange) in Form von TThreadList, in die Du Aufgaben Reinstellst, die jeder Thread abholen kann. Das Reinstellen und Abholen muss natürlich synchronisiert werden (TThreadList.LockList).
In etwa:
Code:
Ist nur eine Grobe Ablaufbeschreibung.
Unit MyThread;
Var MainList: TThreadList; procedure Thread.Execute; Var List: TList; Entry: TObject; // oder was auch immer du in der Liste hast begin List := MainList.LockList; Entry := List.Items[0]; List.Delete(0); MainList.UnLockList; // Verarbeiten: If Entry.Aufgabe = eaLesen then begin // ... end; Entry.Free; end; procedure Button1Click(Sender....); Var List: TList; begin // Eintrag hinzufügen Bsp. List := MainList.LockList; List.Add(MyObject); MainList.UnLockList; end; |
Re: Zuweisen unterschiedlicher Aufgabe für Threads
Hallo endeffects,
wenn Du jedem Thread eine feste Anzahl an Aufgaben zuordnest, könnte die Aufgabenverteilung suboptimal verlaufen (zB falls die Aufgaben des ersten zweier Threads schnell zu verarbeiten wären und die des zweitens recht zeitaufwändig sind). Darüber hinaus bist Du in der Wahl der Anzahl der Threads unflexibel, was im Allgemeinen ein Problem bei begrenzten Ressourcen (zB endliche Anzahl von Netzwerkverbindungen oder Datenbanksessions) darstellen kann. Sofern ich Dein Problem richtig verstehe, handelt es sich um einen Klassiker des Producer-/Consumer-Problems mit mehreren Consumern (und einem "nie aktiven" Producer). Du kannst es also generell Lösen, indem Du einen Pool (genauer eine Queue) von "Aufgaben" erzeugst, der von einem Producer (hier: Einmalig Dein Programm beim erzeugen der Arraywerte) gefüllt und von den Comsumern variabler Anzahl aus einem Threadpool abgearbeitet werden. Mithilfe von Synchronisationsobjekten (zB Events) kannst Du die Consumer "einfrieren" bis neue Aufgaben anstehen (selbstverständlich ist die Queue selbst ebenfalls gegen zeitgleichen Zugriff zu sperren). Suche im Netz nach gängigen Lösungsmustern für dieses Problem. |
Re: Zuweisen unterschiedlicher Aufgabe für Threads
hallo,
ersteinmal danke für eure anregungen, mal schaun ob ich dazu noch was finde |
Re: Zuweisen unterschiedlicher Aufgabe für Threads
Wenn es nur ab 2000 laufen soll kann Windows diesen Thread Pool für dich verwalten. Stichwort für das PSDK wäre
![]() |
Re: Zuweisen unterschiedlicher Aufgabe für Threads
naja ich denke das übersteigt meine möglichkeiten ein wenig
zur zeit, ich werd versuchen die aufgaben für jeden thread beim erzeugen zu übergeben |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:09 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