![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
TThread + ListBox + FindNext [D6, Win2k]
diabolik_krsk © (2005-03-10 07:20:00)Мастера, такая проблемка.
Есть процедура в основной форме
procedure TMain.AddFileToList;
var SearchRec: TSearchRec;
begin
if FindFirst(ExtractFilePath(ParamString(0))+'moduls\'+'*.mod', faAnyFile, SearchRec) = 0 then
begin
while FindNext(SearchRec) = 0 do
begin
if (SearchRec.Name <> '..') and (SearchRec.Name <> '.')
then
begin
ListBox.Items.Add(SearchRec.Name);
end;
end;
FindClose(SearchRec);
end;
эта процедура вызывается из потока в отдельном юните
procedure TFileThread.Execute;
HandleChange: THandle;
begin
HandleChange := FindFirstChangeNotification(PChar(FPath),
False, FILE_NOTIFY_CHANGE_FILE_NAME);
Win32Check(HandleChange <> INVALID_HANDLE_VALUE);
while WaitForSingleObject(HandleChange, 1000) = WAIT_OBJECT_0 do
begin
Synchronize(Update);
FindNextChangeNotification(FNotifier)
end
end;
procedure TFileThread.Update;
begin
Main.AddFileToList;
end;
А вот теперь самое главное: если каталог пустой и в него добавить файл с расширением *.mod (тот который нам нужен) в ListBox он добавляется аж пять раз. Та же история если файлов 2,3 и более. Пробовал через точки остановки проверить где проблема - оказалось что поток вызывает Synchronize пять раз => пять файлов в ListBox/
Подскажите как лечить!
diabolik_krsk (2005-03-10 08:52:00) [1]2 Юрий Зотов
И еще - нет FindCloseChangeNotification. Будет утечка ресурсов.
C этим согласен. Забыл написать :)
К этому потоку это не критично, пока.
Основной вопрос почему пять записей когда файл то один??
Юрий Зотов (2005-03-10 07:45:00) [2]И еще - нет FindCloseChangeNotification. Будет утечка ресурсов.
Вообще, код ожидания выглядит не слишком надежно. Если система окажется чем-то занята и через секунду очередное уведомление не поступит, то цикл прервется по таймауту и поток завершится.
diabolik_krsk (2005-03-10 07:21:00) [3]Ошибочка. там где
FindNextChangeNotification(FNotifier)должно бытьFindNextChangeNotification(HandleChange)