AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

ExternalThread Delphi 2009

Ein Thema von schmitzpm · begonnen am 11. Feb 2010 · letzter Beitrag vom 12. Feb 2010
 
schmitzpm

Registriert seit: 2. Okt 2006
Ort: Kirchheim
9 Beiträge
 
Delphi XE5 Professional
 
#3

Re: ExternalThread Delphi 2009

  Alt 11. Feb 2010, 19:10
Hier mal der Quellcode der eigentlichen Unit:

Delphi-Quellcode:

unit FileChanged;

interface

uses
   Classes,Windows,Dialogs;

type
   TThreadFileChanged = class(TThread)
   private
      ChangeHandle: THandle;
      WatchFile: String;
      { Private-Deklarationen }
   protected
      procedure Execute; override;
      procedure AskAfterFileChanged;
   public
      constructor Create(AWatchFile: String);
      destructor Destroy;
   end;

implementation

uses MainForm, SysUtils, MySynEdit;

{ TThreadFileChanged }

procedure TThreadFileChanged.AskAfterFileChanged;
begin
   if f_MainForm.Editor.HasFileChanged = true
   then
      f_MainForm.FileHasChanged;
end;

constructor TThreadFileChanged.Create(AWatchFile: String);
begin
   inherited Create(False);
   WatchFile:= AWatchFile;
   FreeOnTerminate := True;
  Priority := tpIdle
end;

destructor TThreadFileChanged.Destroy;
begin
  if Self.ExternalThread = True
  then begin
    Exit;
  end;

   if ChangeHandle <> 0
   then
      FindCloseChangeNotification(ChangeHandle);
   inherited Destroy;
end;

procedure TThreadFileChanged.Execute;
begin
   { Thread-Code hier einfügen }
   ChangeHandle := FindFirstChangeNotification(PChar(WatchFile),False,FILE_NOTIFY_CHANGE_LAST_WRITE);
   if ChangeHandle <> INVALID_HANDLE_VALUE
   then
      // Hier wird im 500 ms-Takt die Datei auf Änderungen überprüft.
      while True do begin
         if WaitForSingleObject(ChangeHandle,500) = WAIT_OBJECT_0
         then begin
            Synchronize(AskAfterFileChanged);
            FindNextChangeNotification(ChangeHandle);
            if Terminated then Break;
         end;
      end;
end;

end.


Hier noch einige Proceduren die den Thread starten und stoppen:

Delphi-Quellcode:

procedure Tf_MainForm.StartFileChangedThread;
begin
  // Thread zur Verzeichnisüberprüfung starten
  if SysUtils.ExtractFileDir(Editor.FileName) <> ''
  then
    FFileChanged := TThreadFileChanged.Create(SysUtils.ExtractFileDir(Editor.FileName));
end;


procedure Tf_MainForm.StopFileChangedThread;
begin
  // Thread für Dateiüberwachung ausschalten
  if FFileChanged <> nil then
  begin
    // Nur wenn kein external Thread dann stoppen.
    if FFileChanged.ExternalThread = True
    then begin
      Exit;
    end;

    FFileChanged.Terminate;
    FFileChanged := nil;
  end;
end;


Die beiden Proceduren StartFileChangedThread und StopFileChangedThread werden immer innerhalb eines Vorgans aufgerufen.
Natürlich wird erst der Thread gestoppt, die Tabseite geweichselt oder die Datei abgespeichert und danach der Thread wieder gestartet.
Die Aufrufe finden jeweils über die beiden Proceduren statt.

Vielleicht hat ja jemand eine Idee.
Danke
Peter Schmitz
  Mit Zitat antworten Zitat
 


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 10:36 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