На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
  
> Чтение/запись файлов в отдельном потоке
    Для копирования файла out в файл in я создаю отдельный Thread, который выполняет функцию LoadFile (код функции в конце). Чтобы приостановить поток использую thread.suspend(), но после этого несколько секунд продолжается копирование из файла out в файл in хотя и не так быстро, как при работающем потоке. При вызове thread.abort() копирование прекращается "мгновенно". Применение f_out.Flush() и f_in.Flush() не помогает. Если кто-то знает в чем проблема, буду рад за любую помощь.
    ExpandedWrap disabled
      <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
    Сообщение отредактировано: kl -
      А можно код с Suspend'ом посмотреть?
        При нажатии на кнопку "Pause" вызываю встроенную функцию thread.Suspend(), где thread = new Thread(new ThreadStart(LoadFile));, но запись в файл f_in некоторое время (секунд 10-20) еще продолжается, хотя цикл while(...) {...} останавливается сразу (для проверки создавал счетчик и выводил его значение. При нажатии на "Pause" значение счетчика сразу же переставало увеличиваться, а запись в файл - нет).
          Цитата slon33, 16.07.03, 12:56:08
          При нажатии на кнопку "Pause" вызываю встроенную функцию thread.Suspend(), где thread = new Thread(new ThreadStart(LoadFile));, но запись в файл f_in некоторое время (секунд 10-20) еще продолжается, хотя цикл while(...) {...} останавливается сразу (для проверки создавал счетчик и выводил его значение. При нажатии на "Pause" значение счетчика сразу же переставало увеличиваться, а запись в файл - нет).

          А не из-за буферизации ли стримов такое происходит?
            Слон, а не пробовал с count побаловаться? kl правду сказал, имхо именно изза этого. Хотя чтобы 10-20 секунд, чегото замного:\
              Может и из-за буферизации, но как при нажатии на кнопку "Pause" заставить этот самый буфер побыстрячку "скинуться" на винт и приостановить запись в файл не знаю, хотя при выполнении thread.Abort() размер файла-приемника соответствует значению созданного мною счетчика (т.е. не дожидаясь тех 10-20 секунд). Запись произвожу блоками 1024*1024 байт и увеличиваю счетчик на 1.
                К ранее сказанному хочу добавить, что запись при попытке приостановить поток продолжается 10-20 секунд, но происходит эта запись гораздо медленее, чем при работающем потоке (с каждой секундой все медленнее и медленнее).
                Сообщение отредактировано: slon33 -
                  ЭтУ тебя какая версия фреймворка?
                    Версия framework'a 1.0.3705
                      Поставь 1.1 версию. Проверь, может это фишка или баг в 1.0 версии:)
                        Цитата slon33, 16.07.03, 19:36:14
                        Может и из-за буферизации, но как при нажатии на кнопку "Pause" заставить этот самый буфер побыстрячку "скинуться" на винт и приостановить запись в файл не знаю, хотя при выполнении thread.Abort() размер файла-приемника соответствует значению созданного мною счетчика (т.е. не дожидаясь тех 10-20 секунд). Запись произвожу блоками 1024*1024 байт и увеличиваю счетчик на 1.

                        Ну а почему бы все-таки не отказаться от suspend на время и просто не проверять перед записью в цикле какое-нить событие? Если установлено - скидываешь принудительно буфер (flush) и засыпаешь сам. Заодно и проверим мое предположение.
                          Цитата Technos, 17.07.03, 19:21:50
                          Поставь 1.1 версию. Проверь, может это фишка или баг в 1.0 версии:)

                          Такой совет имеет смысл только если ковыряешься дома в чисто академических целях. Т.к. влечет за собой смену студии на VS 2003.
                            Если фреймворк 1.1 и вправду нельзя привязать к НЕТовской студии (в МСДНе вроде об этом не упоминается?!), то прийдется в цикле делать, а жаль 8-(
                              Дело не в том, что поток при suspend() не останавливается (сам поток как раз и останавливается), а в том, что приоритет потоков выполняющих буфферизированную запись в файл при suspend'e резко снижается (моя теория, что FileStream для своей работы создает вспомогательный поток), вместо того чтобы полностью приостановиться  и скинуть содержимое буффера на винт (flush() после каждого f_in.Write(...) не помогает).
                              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                              0 пользователей:


                              Рейтинг@Mail.ru
                              [ Script execution time: 0,0307 ]   [ 16 queries used ]   [ Generated: 16.04.24, 03:57 GMT ]