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 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 происходит исключение.


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

Наверх

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