Autor Beitrag
Narses
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Di 31.03.09 17:36 
Moin!

Ich brauch mal wieder einen Denk-Schubser von euch... :think: ;)

Ich habe eine Konsolen-App, die mehrere Nachfahren von TThread instanziiert und darauf warten soll, dass alle terminieren, dann kann die Anwendung auch beendet werden. Im Hauptthread soll dabei natürlich die CPU-Last gering bleiben.

Wie macht man das am einfachsten/elegantesten?! :nixweiss: Erschwerend kommt hinzu, dass es u.U. nötig ist, weitere Worker-Threads nachzustarten, wenn noch Arbeit anliegt (konkret: es gibt N Arbeitsaufträge und max. n Worker-Threads, so dass ein Überhang zu beachten ist). Ich habe natürlich als Erstes das OnTerminate-Ereigniss im Auge gehabt, dieses wird aber synchronisiert aufgerufen - was leider in der Konsole nicht klappt, da dort keine MessageLoop greift. Also ohne OnTerminate, aber wie? :gruebel: Hier sind grad irgendwie ziemlich viele Bäume... :?

Bitte folgende Rahmenbedingungen beachten: Konsolen-App deshalb, weil ich keine GUI brauche und die Ausgabe umleiten können will, was bei einer Konsolen-App sehr einfach/universell beim Aufruf geht. Nachfahre(n) von TThread, weil ich mit der Windows-Thread-API selbst kaum Erfahrung habe. :oops: Da das Programm praktisch fertig ist, nur die Thread-Warten-Anbindung nicht läuft, möchte ich ungerne das Ding auf eine VCL-Basis hieven müssen... :roll:

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.
Sinspin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 1340
Erhaltene Danke: 120

Win 10
RIO, CE, Lazarus
BeitragVerfasst: Di 31.03.09 18:25 
Das geht eigentlich sehr einfach. Schau mal was die DOH zu WaitFor (Warten, bis eine Aufgabe ausgeführt ist.) sagt. So, oder so ähnlich müsste es klappen.
Eine andere Möglichkeit ist die WinApi Routine WaitForMultipleObjects. Das kannst du aber nur verwenden wenn dir die Anzahl der Threads die laufen von vorn herein bekannt ist.

Beispiel (zusammenkopiert aus der DOH und ungetestet, müsste aber im großen und ganzen passen):

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
var
  Counter: integer; // globale variable an die alle teilnehmer rankommen
  CounterGuard: TCriticalSection; // dein schutz für den counter

// deine arbeitstiere
procedure TMyThread.Execute;
begin
  // ... die aufgabe des threads

  // danach dann:
  CounterGuard.Acquire; { Zähler mit einer Sperre belegen }
  Dec(Counter);   { Wert der globalen Zählervariable verringern }
  CounterGuard.Release; { Sperre vom Zähler entfernen }
  ...
end;

// dein hauptprogramm
procedure main;
begin
  CounterGuard := TCriticalSection.Create;
  Counter := 100; // die anzahl deiner arbeiter. (initial)
  for i := 1 to Counter do
    TMyThread.Create(False); { Artbeitstiere erzeugen und ausführen }
  while Counter > 0 do
  begin
    // wenn du weitere Arbeitstiere schaffen musst, muss du Counter erhöhen
    if 'Noch mehr arbeit' then
    begin
      // bei jedem zugriff auf den Counter muss sichergestellt werden das dies zur gleichen zeit immer nur einer tut
      CounterGuard.Acquire; { Zähler mit einer Sperre belegen }
      Dec(Counter);   { Wert der globalen Zählervariable verringern }
      CounterGuard.Release; { Sperre vom Zähler entfernen }
    end;
    Sleep(1);
  end;
  // wenn du hier hinkommst sind alle threads beendet.
  CounterGuard.Free;
end;

_________________
Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
Narses Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Administrator
Beiträge: 10185
Erhaltene Danke: 1261

W11x64
TP3 .. D7pro .. D10.2CE
BeitragVerfasst: Mi 01.04.09 12:02 
Moin!

Jou, Danke, das hat geholfen. ;) da muss ich mich doch tatsächlich über die Nutzung der DOH belehren lassen... *seufz*

cu
Narses

_________________
There are 10 types of people - those who understand binary and those who don´t.