Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.119.133.228] |
|
Сообщ.
#1
,
|
|
|
Для копирования файла out в файл in я создаю отдельный Thread, который выполняет функцию LoadFile (код функции в конце). Чтобы приостановить поток использую thread.suspend(), но после этого несколько секунд продолжается копирование из файла out в файл in хотя и не так быстро, как при работающем потоке. При вызове thread.abort() копирование прекращается "мгновенно". Применение f_out.Flush() и f_in.Flush() не помогает. Если кто-то знает в чем проблема, буду рад за любую помощь.
<br>private void LoadFile()<br>{<br> FileStream f_in, f_out;<br> f_out = new FileStream(@"C:\out.txt", FileMode.Open, FileAccess.Read);<br> f_in = new FileStream(@"c:\in.txt", FileMode.Append, FileAccess.Write);<br> int count = 1024;<br> byte[] b = new byte[count];<br> try<br> {<br> while((f_out.Read(b, 0, count) != 0))<br> {<br> f_in.Write(b, 0, count);<br> if((f_out.Length-f_out.Position)<count)<br> count = (int)(f_out.Length-f_out.Position);<br> }<br> }<br> finally<br> {<br> f_out.Close();<br> f_in.Close();<br> }<br>}<br> Цитата Исправлена подсветка синтаксиса. kl |
Сообщ.
#2
,
|
|
|
А можно код с Suspend'ом посмотреть?
|
Сообщ.
#3
,
|
|
|
При нажатии на кнопку "Pause" вызываю встроенную функцию thread.Suspend(), где thread = new Thread(new ThreadStart(LoadFile));, но запись в файл f_in некоторое время (секунд 10-20) еще продолжается, хотя цикл while(...) {...} останавливается сразу (для проверки создавал счетчик и выводил его значение. При нажатии на "Pause" значение счетчика сразу же переставало увеличиваться, а запись в файл - нет).
|
Сообщ.
#4
,
|
|
|
Цитата slon33, 16.07.03, 12:56:08 При нажатии на кнопку "Pause" вызываю встроенную функцию thread.Suspend(), где thread = new Thread(new ThreadStart(LoadFile));, но запись в файл f_in некоторое время (секунд 10-20) еще продолжается, хотя цикл while(...) {...} останавливается сразу (для проверки создавал счетчик и выводил его значение. При нажатии на "Pause" значение счетчика сразу же переставало увеличиваться, а запись в файл - нет). А не из-за буферизации ли стримов такое происходит? |
Сообщ.
#5
,
|
|
|
Слон, а не пробовал с count побаловаться? kl правду сказал, имхо именно изза этого. Хотя чтобы 10-20 секунд, чегото замного:\
|
Сообщ.
#6
,
|
|
|
Может и из-за буферизации, но как при нажатии на кнопку "Pause" заставить этот самый буфер побыстрячку "скинуться" на винт и приостановить запись в файл не знаю, хотя при выполнении thread.Abort() размер файла-приемника соответствует значению созданного мною счетчика (т.е. не дожидаясь тех 10-20 секунд). Запись произвожу блоками 1024*1024 байт и увеличиваю счетчик на 1.
|
Сообщ.
#7
,
|
|
|
К ранее сказанному хочу добавить, что запись при попытке приостановить поток продолжается 10-20 секунд, но происходит эта запись гораздо медленее, чем при работающем потоке (с каждой секундой все медленнее и медленнее).
|
Сообщ.
#8
,
|
|
|
ЭтУ тебя какая версия фреймворка?
|
Сообщ.
#9
,
|
|
|
Версия framework'a 1.0.3705
|
Сообщ.
#10
,
|
|
|
Поставь 1.1 версию. Проверь, может это фишка или баг в 1.0 версии:)
|
Сообщ.
#11
,
|
|
|
Цитата slon33, 16.07.03, 19:36:14 Может и из-за буферизации, но как при нажатии на кнопку "Pause" заставить этот самый буфер побыстрячку "скинуться" на винт и приостановить запись в файл не знаю, хотя при выполнении thread.Abort() размер файла-приемника соответствует значению созданного мною счетчика (т.е. не дожидаясь тех 10-20 секунд). Запись произвожу блоками 1024*1024 байт и увеличиваю счетчик на 1. Ну а почему бы все-таки не отказаться от suspend на время и просто не проверять перед записью в цикле какое-нить событие? Если установлено - скидываешь принудительно буфер (flush) и засыпаешь сам. Заодно и проверим мое предположение. |
Сообщ.
#12
,
|
|
|
Цитата Technos, 17.07.03, 19:21:50 Поставь 1.1 версию. Проверь, может это фишка или баг в 1.0 версии:) Такой совет имеет смысл только если ковыряешься дома в чисто академических целях. Т.к. влечет за собой смену студии на VS 2003. |
Сообщ.
#13
,
|
|
|
Если фреймворк 1.1 и вправду нельзя привязать к НЕТовской студии (в МСДНе вроде об этом не упоминается?!), то прийдется в цикле делать, а жаль 8-(
|
Сообщ.
#14
,
|
|
|
Дело не в том, что поток при suspend() не останавливается (сам поток как раз и останавливается), а в том, что приоритет потоков выполняющих буфферизированную запись в файл при suspend'e резко снижается (моя теория, что FileStream для своей работы создает вспомогательный поток), вместо того чтобы полностью приостановиться и скинуть содержимое буффера на винт (flush() после каждого f_in.Write(...) не помогает).
|