![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как остановить выполнение потока
sally © (2006-04-26 17:49:00)Есть Thread, в котором реализована некоторая процедура, в которой используется API функция
DeviceIoControl (Handle, FSCTL_MOVE_FILE, ...);
Если файл "большой", т.е. занимает много кластеров, то до тех пор пока он не будет перемещен никакой Terminate не помогает. Можно ли как то прервать выполнение данной функции(DeviceIoControl)?
sally (2006-04-27 12:43:00) [41]Спасибо. Попробовал, но чего то не получается
делаю так:
private
lSync: OVERLAPPED;
на создании потока
FillChar(lSync, SizeOf(TOverlapped), 0);
lSync.hEvent := CreateEvent(nil, true, FALSE, #0);
далее
MoveParams.FileHandle := CreateFile(PAnsiChar(AFile.FileName), FILE_READ_ATTRIBUTES, FILE_SHARE_READ OR FILE_SHARE_WRITE OR FILE_SHARE_DELETE, nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
if (MoveParams.FileHandle = INVALID_HANDLE_VALUE) then
MoveParams.FileHandle := CreateFile(PAnsiChar(AFile.FileName), GENERIC_READ,
FILE_SHARE_READ OR FILE_SHARE_WRITE OR FILE_SHARE_DELETE,
nil, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, 0);
....
while WaitForSingleObject(MoveParams.FileHandle, 10) = 0 do
begin
AResult := DeviceIoControl(Volume.Handle, FSCTL_MOVE_FILE, @MoveParams,
sizeof(MoveParams), nil, 0, w, @lSync);
if Terminated then
begin
CancelIo(MoveParams.FileHandle);
Break;
end;
end;
То что выделено жирным, это так было(вместо @lSync был nil). Все работало, но нельзя было остановить. Где я чего не так сделал?
Игорь Шевченко (2006-04-26 17:51:00) [42]
> Если файл "большой", т.е. занимает много кластеров, то до
> тех пор пока он не будет перемещен никакой Terminate не
> помогает
Смотреть в сторону параметра Overlapped в функции DeviceIoControl.
> Можно ли как то прервать выполнение данной функции(DeviceIoControl)?
CancelIO(Ex) ?