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

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

Как остановить выполнение потока


Страницы:   1 2 3

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;


Страницы:   1 2 3

Наверх

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