Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Завершение потока [D7, WinXP]


em240 ©   (2007-09-12 13:52:00) 

while not Terminated do
 begin
repeat
if  ReadDirectoryChangesW(hDir, Buf, BufSize, SubDirs, //становится и не идёт дальше
 FILE_NOTIFY_CHANGE_SIZE,@Returned, nil, nil) then
 begin
 Synchronize(Main.Proc);
 end;
until False;
FreeMem(Buf);
end;
CloseHandle(hDir);
 
 Synchronize(Stop);
как можно завершить данный поток?


Суслик   (2007-09-14 00:09:00) [1]

ну и охота вам?!
копать решение можно имея только первый ответ, имхо, конечна.


tesseract   (2007-09-12 17:58:00) [2]


> evvcom ©   (12.09.07 15:39) [3]


Да функция у него синхронная - пока в папку чего не запишешь она не вернёться. Да и из repeat не выйдет (можно подумать terminated мало), и ошибку во freemem получит. Хакер короче.


Сергей М.   (2007-09-12 17:19:00) [3]


> evvcom ©   (12.09.07 17:16) [7]


Бывает и круче)

Но Автор при это еще и хихикает, как бы демонстрируя непокобелимую уверенность в своих действиях - вотчто умиляет)


evvcom   (2007-09-12 17:16:00) [4]

Да... крута! :-)


Сергей М.   (2007-09-12 17:03:00) [5]


> em240 ©   (12.09.07 16:47) [4]
>
> Buf выделяется в функции синхронизации :)
>


Ай малацца) .. Наш человек ! (С)
Сначала обратился к несуществующему буферу, и только потом его "выделил")
Так держать !


Kolan   (2007-09-12 17:02:00) [6]

Потоку надо послать сообщение «Закрывайся», аон должен будет прервать цикл repeat until False;


em240   (2007-09-12 16:47:00) [7]

Buf выделяется в функции синхронизации :)


evvcom   (2007-09-12 15:39:00) [8]

Поток должен через Terminate корректно завершаться, если нет, ищи ошибки у себя. Я уже несколько вижу прям ща:
1. У тебя нет условия выхода из repeat
2. И если бы оно было, то у тебя внутри беконечного while (не считая Terminate) есть освобождение Buf без предварительного выделения. Что ты будешь освобождать на втором проходе? На третьем?


tesseract   (2007-09-12 14:04:00) [9]


> как можно завершить данный поток?


Делай с overlapped +GetOverlappedResult + CancelIO.


Сергей М.   (2007-09-12 14:04:00) [10]


> как можно завершить данный поток?


Не уверен, но возможно ф-ция вернет управление (с соотв. ошибкой), если закрыть хэндл hDir в контексте другого потока. Проверь сам.

Если не возвращает управление, то выход только один - использование асинхронного режима работы ф-ции (см. справку).


Наверх

Титульная страница Поиск, карта сайта Написать письмо