Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi FileNotification-Callback, Thread und eine kleine Schleife (https://www.delphipraxis.net/163221-filenotification-callback-thread-und-eine-kleine-schleife.html)

PhilCore 20. Sep 2011 11:15


FileNotification-Callback, Thread und eine kleine Schleife
 
Hallo Ihr Delphianer,

ich habe gerade eine kleine, aber feine Aufgabe auf den Tisch bekommen und versuche diese zu lösen. Vielleicht könnt Ihr mir ein bißchen behilflich sein.
Ich werde das mal versuchen, das vereinfacht darzustellen.
Also:
Ich habe mehrere Kanäle (Threads) und jeder Kanal hat eine FileNotification-Instanz, die eine Callback-Funktion erhält.
Die Callback-Funktion ist wie folgt deklariert:
Delphi-Quellcode:
function FnChgCallBack( ENTClientHandle : HFNCHG; InfoData : PFNCHG_FILE_INFORMATIONA ) : Boolean; stdcall;
Delphi-Quellcode:
function TChannelThread.FnChgCallBack(ENTClientHandle: HFNCHG; InfoData: PFNCHG_FILE_INFORMATIONA): Boolean;
var
  _count   : integer;
  _fertig  : boolean;
  _out     : String;
  _sLog    : String;
begin
  result := True;
  _count := 0;
  _fertig := false;
  while (not _fertig) and (_count < 10000) do
  begin
    inc(_count);
    _out := GetOldestFile(FFileChangeNotification.FolderFilter);
    if _out <> '' then
    begin
      _sLog := format('Msg-Datei zur Bearbeitung gefunden --> %s ',[FInputDirectory+ _out]);
      WriteLogAndForm(_sLog, INFOLEVEL);
      Parse_Msg(_out);
    end
    else _fertig := false
  end;
end;
Der else-Zweig ist übrigends falsch. Der läuft immer bis 10000.
Kommen wir mal zu meinen Fragen:

Was passiert mit dem Thread (oder der function) wenn die Schleife noch läuft und ein erneuter Callback reinkommt?
Kann es eigentlich reibungslos funktionieren mit dem Callback oder muß ich den Trick von Lucky http://www.michael-puff.de/Programmierung/Artikel/CallbackMethod.shtml verwenden, um ein sicheres Ergebnis zu bekommen?

In unserem Fall läuft der Dienst nach einiger Zeit zwar noch, aber die Kanäle arbeiten nicht mehr wirklich. Ich habe den verdacht, daß sich der Fehlerteufel (Entwickler) in dem oben beschriebenen Abschnitt befindet.

Viele Fragen, aber ich hoffe auf viele Antworten.

Vielen Dank im Vorraus


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:34 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