Здравствуйте, уважаемые коллеги.
Вопрос заключается в следующем:
Имею объект, который мониторит изменения в определенной папке. Класс объекта наследуется от TThread.
Ниже практически вся реализация.
constructor TChangeMonitor.Create(ASuspended:boolean; const ADirectory:string;
AScanSubDirs:boolean; AOnChange:TNotifyEvent = nil);
begin
FOnChange:=AOnChange;
FDirectory:=ADirectory;
FScanSubDirs:=AScanSubDirs;
FreeOnTerminate:=true;
inherited Create(ASuspended);
end;
procedure TChangeMonitor.DoChange;
begin
if Assigned(FOnChange) then FOnChange(self);
end;
procedure TChangeMonitor.Execute;
var ChangeHandle: THandle;
begin
ChangeHandle:=FindFirstChangeNotification(PChar(FDirectory),
FScanSubDirs,
FILE_NOTIFY_CHANGE_FILE_NAME+
FILE_NOTIFY_CHANGE_DIR_NAME+
FILE_NOTIFY_CHANGE_SIZE);
Win32Check(ChangeHandle <> INVALID_HANDLE_VALUE);
try
while not Terminated do
begin
case WaitForSingleObject(ChangeHandle,1000) of
WAIT_FAILED: Terminate;
WAIT_OBJECT_0:
begin
Synchronize(DoChange);
end;
end;
FindNextChangeNotification(ChangeHandle);
sleep(100);
end;
finally
FindCloseChangeNotification(ChangeHandle);
end;
end;
В обработчике FOnChange показываю модальное окно (ShowMessage) с сообщением, что произошли изменения в папке. Проще некуда.
Но пользователь программы жалуется, что иногда это модальное окно невозможно закрыть (или появляется повторно?).
В начале хотел реализовать триггер, чтобы показывать окно единожды (не открывать повторно, если хотя бы одно открыто).
Но тестирование показало, что и в приведенном виде при открытом в главном потоке ShowMessage событие в этот поток повторно не поступает (при копировании и удалении файлов).
В связи с этим, прошу посмотреть, не допустил ли я в коде каких-либо ошибок.
У пользователя Win10, у меня Win7.