AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Threads anhalten und fortsetzen
Thema durchsuchen
Ansicht
Themen-Optionen

Threads anhalten und fortsetzen

Ein Thema von SyntaxXx · begonnen am 25. Jun 2015 · letzter Beitrag vom 25. Jun 2015
Antwort Antwort
SyntaxXx

Registriert seit: 14. Dez 2008
328 Beiträge
 
Delphi XE4 Architect
 
#1

Threads anhalten und fortsetzen

  Alt 25. Jun 2015, 11:38
Hallo zusammen,
mittlerweile habe ich ein gewissen Grundverständnis mit dem Umgang von Threads.

Jetzt würde ich gerne noch mehr wissen.
Wenn ich z.B. 5 WorkerThreads habe, wie halte ich alle an und starte sie später wieder?
Thread.Suspend und Thread.Resume sind ja deprecated und sollen nicht mehr benutzt werden.

Ich habe gelesen, dass man das mit TEvent oder TMutex machen kann.
Allerdings habe ich bis jetzt kein verständliches Beispiel gefunden.


Und wie könnte ich zum Beispiel einzelne Threads anhalten.
Dazu bräuchte ich ja eigentlich eine Liste mit allen Threads, worüber ich einzelne aussuchen kann.
oder wie macht man das?


Vielen Dank schon mal für eure Zeit.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.143 Beiträge
 
Delphi 10.3 Rio
 
#2

AW: Threads anhalten und fortsetzen

  Alt 25. Jun 2015, 11:42
42!

Warum willst Du den einen Thread anhalten?
Oder soll der "nur" warten bis er die nächste Aufgabe bekommt?

Mavarik
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#3

AW: Threads anhalten und fortsetzen

  Alt 25. Jun 2015, 11:54
Anhalten kannst du im Regelfall, indem du auf etwas wartest.

Ein spannendes Synchronisationsmittel für dein Problem ist die Condition-Variable, insbesondere wenn du deine geteilten Daten/Aufgaben mit einer CriticalSection schützt.
Ansonsten sehen die auto-reset Events doch auch ganz passend aus.

Eine Liste der verfügbaren Threads zu verwalten wäre in der Tat nicht schlecht

Geändert von BUG (25. Jun 2015 um 12:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.063 Beiträge
 
Delphi 12 Athens
 
#4

AW: Threads anhalten und fortsetzen

  Alt 25. Jun 2015, 12:08
Threads hält man nicht an und vorallem niemals von Außen.

Wenn, dann hält der Thread sich selber an. (er ruft selber z.B. Suspend auf)
Oder er ruft einen wartebefehl auf. (am Meisten wird dafür ein Event verwendes, mit einem WaitFor)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.343 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Threads anhalten und fortsetzen

  Alt 25. Jun 2015, 12:56
Der Beitrag vom Sir hat mich kürzlich auf die Spur gebracht: http://www.delphipraxis.net/1268589-post8.html

Danke an der Stelle.
Stahli
http://www.StahliSoft.de
---
"Jetzt muss ich seh´n, dass ich kein Denkfehler mach...!?" Dittsche (2004)
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Threads anhalten und fortsetzen

  Alt 25. Jun 2015, 13:06
Hier mal ein kleiner Worker-Thread (ohne viel Gedöns), den man auch schlafen legen kann.
Delphi-Quellcode:
unit Unit2;

interface

uses
  Classes, SyncObjs, SysUtils, Generics.Collections;

type
  TWorkerThread = class( TThread )
  private
    FLockObj: TObject;
    FIsSleeping: Boolean;
    FWorkEvent: TEvent;
    FWorkQueue: TQueue<TProc>;
  protected
    procedure Execute; override;
    procedure TerminatedSet; override;
  public
    constructor Create( CreateSuspended: Boolean );
    destructor Destroy; override;

    /// <summary>
    /// Arbeit an die WorkerThread-Queue übergeben
    /// </summary>
    procedure PushWork( AWorkProc: TProc );

    /// <summary>
    /// WorkerThread schlafen legen
    /// </summary>
    procedure GoSleeping( );
    /// <summary>
    /// WorkerThread wieder aufwecken
    /// </summary>
    procedure Awake( );
  end;

implementation

{ TWorkerThread }

procedure TWorkerThread.Awake;
begin
  TMonitor.Enter( FLockObj );
  try
    FIsSleeping := False;
    if FWorkQueue.Count > 0 then
      FWorkEvent.SetEvent( );
  finally
    TMonitor.Exit( FLockObj );
  end;
end;

constructor TWorkerThread.Create( CreateSuspended: Boolean );
begin
  FLockObj := TObject.Create( );
  FWorkEvent := TEvent.Create( nil, True, False, '' );
  FWorkQueue := TQueue<TProc>.Create( );

  inherited;
end;

destructor TWorkerThread.Destroy;
begin
  inherited;

  FreeAndNil( FLockObj );
  FreeAndNil( FWorkQueue );
  FreeAndNil( FWorkEvent );
end;

procedure TWorkerThread.Execute;
var
  LWorkProc: TProc;
begin
  inherited;
  while not Terminated do
  begin
    if ( FWorkEvent.WaitFor( ) = wrSignaled ) then
      if not Terminated then
      begin

        // Arbeit aus der Queue holen

        TMonitor.Enter( FLockObj );
        try
          LWorkProc := FWorkQueue.Dequeue( );
          if FWorkQueue.Count = 0 then
            FWorkEvent.ResetEvent( );
        finally
          TMonitor.Exit( FLockObj );
        end;

        // Arbeit erledigen

        LWorkProc( );
      end;
  end;
end;

procedure TWorkerThread.GoSleeping;
begin
  TMonitor.Enter( FLockObj );
  try
    FIsSleeping := True;
    FWorkEvent.ResetEvent( );
  finally
    TMonitor.Exit( FLockObj );
  end;
end;

procedure TWorkerThread.PushWork( AWorkProc: TProc );
begin
  TMonitor.Enter( FLockObj );
  try
    FWorkQueue.Enqueue( AWorkProc );
    if not FIsSleeping then
      FWorkEvent.SetEvent( );
  finally
    TMonitor.Exit( FLockObj );
  end;
end;

procedure TWorkerThread.TerminatedSet;
begin
  inherited;
  FWorkEvent.SetEvent( );
end;

end.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  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 23:00 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