Hallo,
>Programm 1 schreibt seine Daten, die berechnet werden sollen, in Verzeichnis A, Programm 2 wartet darauf, dass in Verzeichnis A Dateien angelegt werden,
Es ist das warten von Programm 2, also die Überwachung eines Verzeichnisses. Ich habe einen ziemlichen Teil des Sonntags damit verbracht dafür eine praktikable Lösung zu suchen.
...
Wie haben Sie das gelöst?
Gar nicht. Ich benutze diese Lösung nicht selbst, sie ist mir nur spontan eingefallen.
Es gibt dafür aber die
WinAPI Funktionen FindFirstChangeNotification / FindNextChangeNotification, die ich z.B. in
dzEditorLineendsFix verwende, um die Font-Datei, die Delphi 2007 erzeugt, jedesmal wieder in ein anderes Verzeichnis zu verschieben.
Der Code läuft in einem Hintergrundthread und sieht so aus:
Delphi-Quellcode:
procedure Tf_EditorLineEndsFix.ExecuteInThread(_Sender: TObject);
var
Err: DWORD;
NotifyHandle: THandle;
Res: DWORD;
begin
try
CheckForFile;
NotifyHandle := FindFirstChangeNotification(PChar(TFileSystem.GetTempPath), false,
FILE_NOTIFY_CHANGE_FILE_NAME);
if NotifyHandle = INVALID_HANDLE_VALUE
then begin
Err := GetLastError;
RaiseLastOsErrorEx(Err, _('
Error %1:s (%0:d)'));
end;
try
while not TThread.CheckTerminated
do begin
Res := WaitForSingleObject(NotifyHandle, 100);
if res = WAIT_OBJECT_0
then begin
CheckForFile;
if not FindNextChangeNotification(NotifyHandle)
then begin
Err := GetLastError;
RaiseLastOsErrorEx(Err, _('
Error %1:s (%0:d)'));
end;
end else if res = WAIT_TIMEOUT
then begin
// stay in the loop
end else
raise Exception.CreateFmt(_('
WaitForSingleObject failed with error code %d.'), [res]);
end;
finally
FindCloseChangeNotification(NotifyHandle);
end;
except
on e:
Exception do begin
doWriteToLog(e.
Message);
end;
end;
end;
Im Prinzip könntest Du diesen Code nutzen, müsstest nur in CheckForFile die Verarbeitung vornehmen. Und natürlich in FindFirstNotification statt TFileSystem.GetTempPath das korrekte Verzeichnis übergeben.
Und nicht vergessen: Der Code sollte in einem Hintergrund-Thread laufen, sonst blockiert er das UI.