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-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) ?


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

Наверх

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