![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как остановить выполнение потока
sally © (2006-04-26 17:49:00)Есть Thread, в котором реализована некоторая процедура, в которой используется API функция
DeviceIoControl (Handle, FSCTL_MOVE_FILE, ...);
Если файл "большой", т.е. занимает много кластеров, то до тех пор пока он не будет перемещен никакой Terminate не помогает. Можно ли как то прервать выполнение данной функции(DeviceIoControl)?
sally (2006-04-28 10:17:00) [21]>Сергей М
Я тоже умею пользоваться Ctrl+C и Ctrl+V
>Быть того не может.
Это из цикла:
-Ты суслика видишь.
-Нет.
-И я нет, а он есть
Функция ожидает окончания процесса перемещения.
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);
Так "создается" девайс.
в [10] все далее.
Сергей М. (2006-04-28 08:54:00) [22]
> Не выходит именно из этой операции
Быть того не может.
Цитата из справки к DeviceIoControl:
If hDevice was opened with the FILE_FLAG_OVERLAPPED flag, this parameter must point to a valid OVERLAPPED structure. In this case, DeviceIoControl is performed as an overlapped (asynchronous) operation. If the device was opened with FILE_FLAG_OVERLAPPED and lpOverlapped is NULL, the function fails in unpredictable ways.
If hDevice was opened without specifying the FILE_FLAG_OVERLAPPED flag, this parameter is ignored and the DeviceIoControl function does not return until the operation has been completed, or an error occurs.
Sally (2006-04-27 19:39:00) [23]AResult := DeviceIoControl(Volume.Handle, FSCTL_MOVE_FILE, @MoveParams, sizeof(MoveParams), nil, 0, w, @DeviceIoSync);
Не выходит именно из этой операции!!!
Sally (2006-04-27 19:23:00) [24]А может быть дело в INFINITE?
Sally (2006-04-27 19:18:00) [25]Не, там ничего такого нет...
Игорь Шевченко (2006-04-27 19:10:00) [26]Sally (27.04.06 19:06) [16]
А по ссылке ничего не подходит ?
Sally (2006-04-27 19:06:00) [27]Ну это я не придумал, просто дефрагментаторы при остановке дефрагментации не ждут окончания переноса файла. Большие файлы соответственно долго переносятся. Так вот если остановить процесс во время дефрагментации этого файла он остается на месте и не дефрагментируется.
Игорь Шевченко (2006-04-27 19:02:00) [28]
> В догонку.... В смысле не останавливает процесс перемещения
> файла.
А как ты себе представляешь остановку процесса перемещения файла ? Половина кластеров переместилась, а половина на старом месте ?
Игорь Шевченко (2006-04-27 19:01:00) [29]http://www.sysinternals.com/Information/DiskDefragmenting.html
Sally (2006-04-27 19:00:00) [30]Сорри...
Не выходит из
AReason := WaitForMultipleObjects(2, @Handles, False, INFINITE);
Sally (2006-04-27 19:00:00) [31]В догонку.... В смысле не останавливает процесс перемещения файла.
Игорь Шевченко (2006-04-27 18:59:00) [32]
> Не выходит из DeviceIoControl....
???? Как не выходит
sally (2006-04-27 18:50:00) [33]сделал следующее:
private
DeviceIoSync: OVERLAPPED;
ThreadSync: OVERLAPPED;
.....
public
procedure StopThread;
procedure TThread1.StopThread;
begin
SetEvent(ThreadSync.hEvent);
Self.Terminate;
end;
constructor ....
FillChar(DeviceIoSync, SizeOf(TOverlapped), 0);
FillChar(ThreadSync, SizeOf(TOverlapped), 0);
DeviceIoSync.hEvent := CreateEvent(nil, true, FALSE, #0);
ThreadSync.hEvent := CreateEvent(nil, true, FALSE, #0);
....
Handles[0] := DeviceIoSync.hEvent;
Handles[1] := ThreadSync.hEvent;
....
AResult := DeviceIoControl(Volume.Handle, FSCTL_MOVE_FILE, @MoveParams, sizeof(MoveParams), nil, 0, w, @DeviceIoSync);
Win32Check(AResult);
AReason := WaitForMultipleObjects(2, @Handles, False, INFINITE);
case AReason of
WAIT_OBJECT_0: Result := mfrSuccess;
WAIT_OBJECT_0 + 1, WAIT_ABANDONED_0 + 1, WAIT_ABANDONED_0: CancelIO(MoveParams.FileHandle);
end;;
Не выходит из DeviceIoControl....
Игорь Шевченко (2006-04-27 15:37:00) [34]
> а где про все это можно прочитать подробно желательно с
> примерами?
Джеффри Рихтер, программирование для Win32
Сергей М. (2006-04-27 15:21:00) [35]
> Sally (27.04.06 14:44) [7]
msdn.microsoft.com
Sally (2006-04-27 14:44:00) [36]а где про все это можно прочитать подробно желательно с примерами?
Polevi (2006-04-27 13:57:00) [37]это некий объект при сигнале которого поточная ф-ия завершает свою работу
переводить этот объект в сигнальное состояние должен ты когда пожелаешь "остановить выполнение потока"
Sally (2006-04-27 13:51:00) [38]>это событие на завершение потока
А это что?
Игорь Шевченко (2006-04-27 12:57:00) [39]
> Где я чего не так сделал?
Как минимум, не проверил состояние операции. Кроме того, при асинхронной операции управление в программу возвращается сразу после вызова DeviceIoControl, после него нужен WaitForMultipleObjects, где один из объектов - это событие асинхронного ввода-вывода (Overlapped.hEvent), а другой - это событие на завершение потока, внешнее.
Сергей М. (2006-04-27 12:54:00) [40]try
AResult := DeviceIoControl(Volume.Handle, FSCTL_MOVE_FILE, @MoveParams,
sizeof(MoveParams), nil, 0, w, @lSync);
Win32Check(AResult);
try
while not Terminated do and (WaitForSingleObject( lSync.hEvent, 10) <> WAIT_OBJECT_0) do;
finally
CanselIO(MoveParams.FileHandle);
end;
except
..
end;