Einzelnen Beitrag anzeigen

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