![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Завершение потока [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 в контексте другого потока. Проверь сам.
Если не возвращает управление, то выход только один - использование асинхронного режима работы ф-ции (см. справку).