powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как правильно "прибить" копирующий поток?
25 сообщений из 61, страница 1 из 3
Как правильно "прибить" копирующий поток?
    #39470079
m52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте,

У меня есть простейший поток cpyThread, который просто вызывает WinApi.Windows.CopyFile для копирования файла и больше ничего не делает. Я хочу прервать копирование, т.е. убить поток копирования cpyThread.

Делаю это вот так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
      cpyThread:=TcpyThread.Create(true);
      cpyThread.Suspended:=false; // пуск!
      // Ожидаем завершение потока (с возможностью отмены)
      
      // В случае отмены прибиваем поток жестко
      cpyThread.DoTerminate;
      TerminateThread(cpyThread.Handle, 0);
      FreeAndNil(cpyThread);


Проблемы 2 шт:
1) поток убивается несколько минут (далеко не сразу) и на одной из операций "зависает"
2) файл в конечной папке (куда копируется) остается заблокированным даже на чтение.

Надо чтобы поток завершился быстро, закончились операции чтения-записи на диск, и самое главное, чтобы поток "отпустил файл".

Как корректно и быстро завершить поток, копирующий файл?
Прошу использование CopyFileEx не предлагать.
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39470082
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m52Прошу использование CopyFileEx не предлагать.

Тогда Вам на форум проктостоматологов.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39470083
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m52 Как корректно и быстро завершить поток, копирующий файл?
Никак. Корректно поток может завершиться только по собственной инициативе.
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39470085
m52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ладно, тогда такой вопрос:
как безопасно убить поток? Ведь понятно, что CopyFile невозможно иначе никак прервать. Поэтому я решил обернуть ее в отдельный поток и попытаться убить поток в случае отмены.

Или может подскажете другую идею, как еще можно прервать работу функции CopyFile?
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39470106
GunSmoker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m52, в native поток нельзя убить безопасно. Только процесс. Убийство же потока приведёт к гигантской утечке памяти, а равно как имеет ненулевой шанс подвесить процесс.

Используйте средства, позволяющие прервать операцию.
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39470108
schi
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GunSmokerУбийство же потока приведёт к гигантской утечке памяти

На размер стека потока или еще на что-то ?
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39470115
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m52Или может подскажете другую идею, как еще можно прервать работу функции CopyFile?Заменть ее на CopyFileEx, которую прервать можно.
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39470117
rgreat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А, если "Ex не предлогать" - Thread.Free - ваш выбор.
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39470121
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m52,
вынеси операцию копирования в отдельный процесс, не в поток.

Это не больно. :)
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39470128
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m52, если так боитесь CopyFileEx, то сделайте свой цикл копирования в потоке и прерывайте его когда угодно по флагу Terminated.
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39470133
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mike,

ты что, нельзя.

Коллега уже больше года с мировой энтропией в этом направлении борется: http://www.sql.ru/forum/1211768/preryvanie-copyfile-ili-korrektnoe-ubiystvo-potoka
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39470241
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чего - то смотрю и вижу дичь, глаза на жопе и руки на лице - фейспалмом прикрывают всё это дело.

Стандартный CreateFile + SetFilePointer + ReadFile открывают файл 150 мб за долю секунды грузя в память.

Если надо быстрее, то используйте NTFS копирование. Но это явно не для ТС ибо хард поламает.
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39470252
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Поползал в интернете и нашёл

Исходную функцию CopyFileW

Использует CopyFileExW

А там стандартный CreateFileW + ReadFile как я и писал выше (Опыт позволил сказать как она работает)
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39470264
Mikhalich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Наверное делать копирование ручками через overlapped операции. Прерывать можно через APC при ожидании, например, на WaitForMultipleObjectsEx.
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39470653
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m52,

Можно обернуть поток в while..do, в условии поставить флаг и ждать либо естественного завершения жизни потока, либо окончания условия в while.

з.ы. задай FreeOnTerminate=false, раз уж ты используешь FreeAndNil и оберни это все в try..finally
з.ы.2 лучше сделай этот поток дополнительным и копируй файлы в OnExecute этого потока. Тогда и прибить поток сможешь в любой момент. А так ты смешал мух с котлетами
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39470655
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Док, нет. У него в потоке долговременная синхртнная операция, которой начхать на все флаги и while.
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39470732
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДДок, нет
вона оно че, Михалыч. А я с телефона и не разглядел
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39471137
m52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте,

спасибо за комменты, поток все таки убивается, хотя и с задержкой.
Убивать поток придется редко, только если юзер отменяет операцию.
Но бывает (крайне редко), что с флешки файл не читается и программа впадает в бесконечность ... И тут только снятие задачи через диспетчер задач поможет. Даже поток не прибить.

Всем спасибо.
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39471142
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Просто удивительное стремление сделать через ж...
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39471267
m52
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
misha mike ,

Вы просто наверное не в курсе, что самая быстрая функция копирования - это именно CopyFile, особенно, по локальной сети (не CopyFileEx и не вручную по-блочно). CopyFile была выбрана из соображения скорости копирования.
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39471281
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m52misha mike ,

Вы просто наверное не в курсе, что самая быстрая функция копирования - это именно CopyFile, особенно, по локальной сети (не CopyFileEx и не вручную по-блочно). CopyFile была выбрана из соображения скорости копирования.

Да нет. Просто ты у нас тут местный д*р*чёк. Я уже написал как она работает, и даже сорцы дал. А ты гнёшь своё

20556671
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39471440
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшикm52misha mike ,

Вы просто наверное не в курсе, что самая быстрая функция копирования - это именно CopyFile, особенно, по локальной сети (не CopyFileEx и не вручную по-блочно). CopyFile была выбрана из соображения скорости копирования.

Да нет. Просто ты у нас тут местный д*р*чёк. Я уже написал как она работает, и даже сорцы дал. А ты гнёшь своё

20556671
А с чего ты взял, что реализация методов вайна совпадает с реализацией методов винды?
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39471463
misha mike
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
m52Вы просто наверное не в курсе, что самая быстрая функция копирования - это именно CopyFile, особенно, по локальной сети (не CopyFileEx и не вручную по-блочно). CopyFile была выбрана из соображения скорости копирования.
Работа с диском (сетью) -- это всегда работа с диском (сетью) и никаких чудес тут не бывает. Думаете эта функция волшебная?

Единственный способ заметно ускорить копирование -- совместить во времени чтение следующего блока из источника с записью предыдущего блока на назначение. Это ускорит процесс при условии, что источник и назначение -- не одно устройство, и они не находятся за общим узким каналом связи.

Неужели так трудно реализовать этот простой алгоритм и нужно плодить говнософт, который киляет активные потоки и оставляет заблокированные файлы в системе? Вы с выбором профессии не ошиблись?

Кстати, помнится, по бенчмаркам плагин bcopy для FAR Manager даже несколько быстрее, чем CopyFile. Вот где настоящая магия!
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39471480
Няшик
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
чччДНяшикпропущено...


Да нет. Просто ты у нас тут местный д*р*чёк. Я уже написал как она работает, и даже сорцы дал. А ты гнёшь своё

20556671
А с чего ты взял, что реализация методов вайна совпадает с реализацией методов винды?

Не думаю что, там будут слишком разные алгоритмы копирования. Майки ведь не пишут на каждую функции какие - то ново выдуманные функции. У них есть свой API и над этим API строят ряд других функций названных API
...
Рейтинг: 0 / 0
Как правильно "прибить" копирующий поток?
    #39471485
чччД
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Няшик,

ничем не обоснованные фантазии.
...
Рейтинг: 0 / 0
25 сообщений из 61, страница 1 из 3
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Как правильно "прибить" копирующий поток?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]