|
|
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, У меня есть простейший поток cpyThread, который просто вызывает WinApi.Windows.CopyFile для копирования файла и больше ничего не делает. Я хочу прервать копирование, т.е. убить поток копирования cpyThread. Делаю это вот так: Код: pascal 1. 2. 3. 4. 5. 6. 7. 8. Проблемы 2 шт: 1) поток убивается несколько минут (далеко не сразу) и на одной из операций "зависает" 2) файл в конечной папке (куда копируется) остается заблокированным даже на чтение. Надо чтобы поток завершился быстро, закончились операции чтения-записи на диск, и самое главное, чтобы поток "отпустил файл". Как корректно и быстро завершить поток, копирующий файл? Прошу использование CopyFileEx не предлагать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2017, 19:57:01 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
m52Прошу использование CopyFileEx не предлагать. Тогда Вам на форум проктостоматологов. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2017, 20:00:21 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
m52 Как корректно и быстро завершить поток, копирующий файл? Никак. Корректно поток может завершиться только по собственной инициативе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2017, 20:04:09 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
Ладно, тогда такой вопрос: как безопасно убить поток? Ведь понятно, что CopyFile невозможно иначе никак прервать. Поэтому я решил обернуть ее в отдельный поток и попытаться убить поток в случае отмены. Или может подскажете другую идею, как еще можно прервать работу функции CopyFile? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2017, 20:09:49 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
m52, в native поток нельзя убить безопасно. Только процесс. Убийство же потока приведёт к гигантской утечке памяти, а равно как имеет ненулевой шанс подвесить процесс. Используйте средства, позволяющие прервать операцию. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2017, 22:36:19 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
GunSmokerУбийство же потока приведёт к гигантской утечке памяти На размер стека потока или еще на что-то ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2017, 22:41:39 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
m52Или может подскажете другую идею, как еще можно прервать работу функции CopyFile?Заменть ее на CopyFileEx, которую прервать можно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2017, 23:31:30 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
А, если "Ex не предлогать" - Thread.Free - ваш выбор. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2017, 23:35:13 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
m52, вынеси операцию копирования в отдельный процесс, не в поток. Это не больно. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.06.2017, 23:42:14 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
m52, если так боитесь CopyFileEx, то сделайте свой цикл копирования в потоке и прерывайте его когда угодно по флагу Terminated. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2017, 01:08:49 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
misha mike, ты что, нельзя. Коллега уже больше года с мировой энтропией в этом направлении борется: http://www.sql.ru/forum/1211768/preryvanie-copyfile-ili-korrektnoe-ubiystvo-potoka ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2017, 02:43:57 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
Чего - то смотрю и вижу дичь, глаза на жопе и руки на лице - фейспалмом прикрывают всё это дело. Стандартный CreateFile + SetFilePointer + ReadFile открывают файл 150 мб за долю секунды грузя в память. Если надо быстрее, то используйте NTFS копирование. Но это явно не для ТС ибо хард поламает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2017, 15:03:12 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
Поползал в интернете и нашёл Исходную функцию CopyFileW Использует CopyFileExW А там стандартный CreateFileW + ReadFile как я и писал выше (Опыт позволил сказать как она работает) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2017, 16:06:58 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
Наверное делать копирование ручками через overlapped операции. Прерывать можно через APC при ожидании, например, на WaitForMultipleObjectsEx. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.06.2017, 16:45:13 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
m52, Можно обернуть поток в while..do, в условии поставить флаг и ждать либо естественного завершения жизни потока, либо окончания условия в while. з.ы. задай FreeOnTerminate=false, раз уж ты используешь FreeAndNil и оберни это все в try..finally з.ы.2 лучше сделай этот поток дополнительным и копируй файлы в OnExecute этого потока. Тогда и прибить поток сможешь в любой момент. А так ты смешал мух с котлетами ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 01:38:08 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
Док, нет. У него в потоке долговременная синхртнная операция, которой начхать на все флаги и while. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 01:49:41 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
чччДДок, нет вона оно че, Михалыч. А я с телефона и не разглядел ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 10:43:43 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, спасибо за комменты, поток все таки убивается, хотя и с задержкой. Убивать поток придется редко, только если юзер отменяет операцию. Но бывает (крайне редко), что с флешки файл не читается и программа впадает в бесконечность ... И тут только снятие задачи через диспетчер задач поможет. Даже поток не прибить. Всем спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 19:14:49 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
Просто удивительное стремление сделать через ж... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.06.2017, 19:20:55 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
misha mike , Вы просто наверное не в курсе, что самая быстрая функция копирования - это именно CopyFile, особенно, по локальной сети (не CopyFileEx и не вручную по-блочно). CopyFile была выбрана из соображения скорости копирования. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 08:52:40 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
m52misha mike , Вы просто наверное не в курсе, что самая быстрая функция копирования - это именно CopyFile, особенно, по локальной сети (не CopyFileEx и не вручную по-блочно). CopyFile была выбрана из соображения скорости копирования. Да нет. Просто ты у нас тут местный д*р*чёк. Я уже написал как она работает, и даже сорцы дал. А ты гнёшь своё 20556671 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 09:17:04 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
Няшикm52misha mike , Вы просто наверное не в курсе, что самая быстрая функция копирования - это именно CopyFile, особенно, по локальной сети (не CopyFileEx и не вручную по-блочно). CopyFile была выбрана из соображения скорости копирования. Да нет. Просто ты у нас тут местный д*р*чёк. Я уже написал как она работает, и даже сорцы дал. А ты гнёшь своё 20556671 А с чего ты взял, что реализация методов вайна совпадает с реализацией методов винды? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 12:27:36 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
m52Вы просто наверное не в курсе, что самая быстрая функция копирования - это именно CopyFile, особенно, по локальной сети (не CopyFileEx и не вручную по-блочно). CopyFile была выбрана из соображения скорости копирования. Работа с диском (сетью) -- это всегда работа с диском (сетью) и никаких чудес тут не бывает. Думаете эта функция волшебная? Единственный способ заметно ускорить копирование -- совместить во времени чтение следующего блока из источника с записью предыдущего блока на назначение. Это ускорит процесс при условии, что источник и назначение -- не одно устройство, и они не находятся за общим узким каналом связи. Неужели так трудно реализовать этот простой алгоритм и нужно плодить говнософт, который киляет активные потоки и оставляет заблокированные файлы в системе? Вы с выбором профессии не ошиблись? Кстати, помнится, по бенчмаркам плагин bcopy для FAR Manager даже несколько быстрее, чем CopyFile. Вот где настоящая магия! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 12:59:25 |
|
||
|
Как правильно "прибить" копирующий поток?
|
|||
|---|---|---|---|
|
#18+
чччДНяшикпропущено... Да нет. Просто ты у нас тут местный д*р*чёк. Я уже написал как она работает, и даже сорцы дал. А ты гнёшь своё 20556671 А с чего ты взял, что реализация методов вайна совпадает с реализацией методов винды? Не думаю что, там будут слишком разные алгоритмы копирования. Майки ведь не пишут на каждую функции какие - то ново выдуманные функции. У них есть свой API и над этим API строят ряд других функций названных API ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.06.2017, 13:24:58 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39470085&tid=2042151]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
155ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
48ms |
get tp. blocked users: |
1ms |
| others: | 199ms |
| total: | 438ms |

| 0 / 0 |
