![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как остановить выполнение потока
sally © (2006-04-26 17:49:00)Есть Thread, в котором реализована некоторая процедура, в которой используется API функция
DeviceIoControl (Handle, FSCTL_MOVE_FILE, ...);
Если файл "большой", т.е. занимает много кластеров, то до тех пор пока он не будет перемещен никакой Terminate не помогает. Можно ли как то прервать выполнение данной функции(DeviceIoControl)?
Sally (2006-04-28 17:04:00) [1]>Сергей М.
Читал
>Игорь Шевченко
Да
Игорь Шевченко (2006-04-28 17:01:00) [2]
> Status=0
На файле любого размера ?
Сергей М. (2006-04-28 16:54:00) [3]http://www.sysinternals.com/Information/DiskDefragmenting.html
Это читал ?
Sally (2006-04-28 16:49:00) [4]Status=0
Игорь Шевченко (2006-04-28 16:44:00) [5]Sally (28.04.06 16:26) [37]
А чему равен Status ?
Sally (2006-04-28 16:26:00) [6]Ничего тогда не понимаю...
status := NtFsControlFile(Volume.Handle, DeviceIoSync.hEvent, nil, nil, @ioStatus, FSCTL_MOVE_FILE, @MoveParams, sizeof(MoveParams), nil, 0);
if ( status = STATUS_PENDING ) then
begin
WaitForSingleObject(MoveParams.FileHandle, INFINITE);
status := ioStatus.Status;
end;
Ниразу он внутрь if не заходит.
Сергей М. (2006-04-28 16:18:00) [7]Если DeviceHandle = True, то вызов правильный.
Но я бы добавил к FILE_FLAG_OVERLAPPED флаг FILE_FLAG_NO_BUFFERING.
Игорь Шевченко (2006-04-28 16:13:00) [8]Sally (28.04.06 16:09) [34]
Я бы, как минимум, добавил GENERIC_WRITE, так как операции по перемещению файла по идее требуют доступ на запись.
Я бы, как минимум, вставил бы просто имя диска, соответственно требованиям CreateFile, для исключения остальных проблем на данном этапе.
И вообще, постарался бы написать простой пример, который можно вопроизвести другими.
Sally (2006-04-28 16:09:00) [9]Скажите, этот высов правильный, для того, чтобы установить OVERLAPPED режим?
DeviceHandle := CreateFile(PAnsiChar(UnNormilizeDrive(DriveName)), GENERIC_READ,
FILE_SHARE_READ or FILE_SHARE_WRITE or FILE_SHARE_DELETE,
nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
function UnNormilizeDrive(const ADrivePath: string): string;
begin
Result := '//./' + Copy(ADrivePath, 1, Pos('\', ADrivePath) - 1)
end;
Потому что и с NtFsControlFile ничего не получается.
Sally (2006-04-28 15:29:00) [10]То что нужно. Спасибо
Игорь Шевченко (2006-04-28 15:26:00) [11]
> ... А может кто видел реализацию NTDDK.H для Delphi
на www.delphi-jedi.org поищи
еще здесь кое-что: http://kladovka.net.ru/download.cgi?id=48
sally (2006-04-28 15:22:00) [12]Дааа... А может кто видел реализацию NTDDK.H для Delphi
sally (2006-04-28 12:05:00) [13]Прикольно, но ни в MSDN ни на сайте msdn.microsoft.com ничего про эту функцию нет...
Попробуем...
Сергей М. (2006-04-28 11:47:00) [14]Попробуй использовать NtFsControlFile вместо DeviceIoControl.
Кстати, ты ОС не обозначил, скорей всего есть какие-то системозависимые ограничения в этой части.
Sally (2006-04-28 11:24:00) [15]>Какой результат возвращает DeviceIoControl после начала операции
DeviceIoControl ждет окончания операции. Он ничего не возвращает.
Повотрюсь, скорее всего не включается overlapped режим...
Игорь Шевченко (2006-04-28 11:13:00) [16]При начале асинхронной операции функция GetLastError должна возращать ERROR_IO_PENDING (997)
Сергей М. (2006-04-28 11:13:00) [17]
> Это что такое?
Это меню Run -> Program Pause
Sally (2006-04-28 11:02:00) [18]>А останов треда по Program Pause при этом нормально происходит
Это что такое?
В смысле, если Thread.Terminate или Thread.Suspend сдедать?
Нормально... Т.е. DeviceIoControl продолжает выполнение операции :) Вот когда он закончит, тогда Thread и дестроится.
Почему-то не включается overlapped режим...
Игорь Шевченко (2006-04-28 11:02:00) [19]Какой результат возвращает DeviceIoControl после начала операции ?
Сергей М. (2006-04-28 10:41:00) [20]
> sally (28.04.06 10:17) [22]
А останов треда по Program Pause при этом нормально происходит ?
Я к тому что здесь всего два варианта : либо overlapped-режим не задействован, либо при вызове DeviceIoControl происходит исключение.