Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Unit in Thread packen?! (https://www.delphipraxis.net/59040-unit-thread-packen.html)

NicoDE 16. Dez 2005 12:53

Re: Unit in Thread packen?!
 
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, SysUtils, Classes, Controls, Forms, StdCtrls;

type
  TScanThread = class(TThread)
  private
    FList: TStringList;
  public
    constructor Create(CreateSuspended: Boolean); virtual;
    destructor Destroy(); override;
    procedure Execute(); override;
    property List: TStringList read FList;
  end;

type
  TForm1 = class(TForm)
    ListBox1: TListBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
    ScanTerminated: Boolean;
    procedure OnScanTerminated(Sender: TObject);
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  ActiveConnections;

{$R *.dfm}

{ TScanThread }

constructor TScanThread.Create(CreateSuspended: Boolean);
begin
  // inherited (angehalten)
  inherited Create(True);
  // private Variablen initialisieren
  FList := TStringList.Create();
  // fortsetzen falls gefordert
  if not CreateSuspended then
    Resume();
end;

destructor TScanThread.Destroy();
begin
  // private Variablen freigeben
  FList.Free();
  // inherited
  inherited Destroy();
end;

procedure TScanThread.Execute();
begin
  // was auch immer...
  ScanNetworkResources(RESOURCETYPE_DISK, RESOURCEDISPLAYTYPE_GENERIC, FList);
end;

{ TForm1 }

procedure TForm1.OnScanTerminated(Sender: TObject);
begin
  // scan beendet
  ScanTerminated := True;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  // Button deaktivieren (Schutz for Doppelklick)
  Button1.Enabled := False;
  try
    // ScanThread erzeugen (angehalten)
    with TScanThread.Create(True) do
    try
      // Beim Beenden nicht freigeben (wir brauchen Zugriff auch die Liste)
      FreeOnTerminate := False;
      // ScanTerminated initialisieren
      ScanTerminated := False;
      // Ereignisroutine setzen
      OnTerminate := OnScanTerminated;
      // nun den Thread arbeiten lassen
      Resume();
      // Warten bis der Thread fertig ist
      while not ScanTerminated do
        // Solange die GUI reagieren lassen...
        Application.ProcessMessages();
      // Ergebnisliste holen
      ListBox1.Items.Text := List.Text;
    finally
      // Thread freigeben
      Free();
    end;
  finally
    // Button reaktivieren
    Button1.Enabled := True;
  end;
end;

end.

XeRo 19. Dez 2005 06:53

Re: Unit in Thread packen?!
 
vielen dank...funktioniert super...auf das wär ich nie gekommen...


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:10 Uhr.
Seite 2 von 2     12   

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