|
Как ускорить запись в файл?
|
|||
---|---|---|---|
#18+
Есть прога. Она записывает в файл массивы с интервалом 12мс. Но из 1000 только порядка 980 записывается. Остальные почему то пропускаются. Подскажите пожалуйста как это исправить? namespace button6000 { public partial class Form1 : Form { int[] nums = new int[198]; int Count = 0; bool ArrayReady; StreamWriter output; Thread newThrd; public Form1() { InitializeComponent(); } void Run1() { // цикл на 6000 массивов do { // записываем 1 массив и инкрементируем счетчик if (ArrayReady == true) { saveToFile(); Count++; ArrayReady = false; } } while (Count < 1000); } // записывается всегда по 1 массиву void saveToFile() { output = null; try { // добавляем В КОНЕЦ файла 1 массив output = new StreamWriter("outputfile.txt", true); output.WriteLine("Новый кадр" + Count); for (int i = 0; i < nums.Length; i++) { output.WriteLine(nums[i]); } output.WriteLine("Конец кадра" + Count); } catch (IOException exc) { output.WriteLine("Ошибка ввода-вывода\n" + exc.Message); } finally { if (output != null) output.Close(); // обнулить массив (потом надо будет закоментировать этот for) // массив будет обнуляться средствами основной проги for (int i = 0; i < nums.Length; i++) { nums[i] = 0; } } } // запуск потока. // запись массивов в файл организуем в отдельном потоке, // т.к. запись должна производиться одновременно с работой основной проги, // в которую будет встроена данная прога. private void buttonSave_Click(object sender, EventArgs e) { if (newThrd == null) { // сконструировать и начать выполнение потока. newThrd = new Thread(this.Run1); newThrd.IsBackground = true; newThrd.Priority = ThreadPriority.Highest; // необязательно newThrd.Start(); } } // сгенерировать 1000 проверочных массивов // чтобы проверить их запись в файл private void button3_Click(object sender, EventArgs e) { for (int j = 0; j < 1000; j++) { for (int i = 0; i < nums.Length; i++) { nums[i] = i+j*1000; } ArrayReady = true; Thread.Sleep(12); } } } } ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 10:39 |
|
Как ускорить запись в файл?
|
|||
---|---|---|---|
#18+
Прикрепил архив с прогой ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 10:46 |
|
Как ускорить запись в файл?
|
|||
---|---|---|---|
#18+
webber81, Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14.
У вас ArrayReady в цикле блокирует вызов функции saveToFile(); Вы вроде бы хотите 1000 раз цикл прокрутить, а реально выходит только один. Но это произошло потому, что вы с дизайном намудрили. Зачем вообще ArrayReady ? Блокирует нажатие кнопки, если массивы не готовы? Так лучше наоборот сделать - перед выполнением проверить, что все готово, и если нет - уведомить кого нужно. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 11:03 |
|
Как ускорить запись в файл?
|
|||
---|---|---|---|
#18+
косяков много, в отсутвие arrayready цикл жрёт процессор почём зря, гораздо хуже, что доступ к ArrayReady непотокобезопасен ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 11:07 |
|
Как ускорить запись в файл?
|
|||
---|---|---|---|
#18+
D129, Кроме того, есть такие обертки как BackgroundWorker, File.AppendAllLines(...) И тому подобное. :-) ... |
|||
:
Нравится:
Не нравится:
|
|||
20.01.2014, 11:08 |
|
Как ускорить запись в файл?
|
|||
---|---|---|---|
#18+
D129D129, Зачем вообще ArrayReady ? Блокирует нажатие кнопки, если массивы не готовы? Так лучше наоборот сделать - перед выполнением проверить, что все готово, и если нет - уведомить кого нужно. :-) Дело в том, что массивы поступают с интервалом в 12мс. И каждый последующий должен быть записан до получения предыдущего. D129D129, Кроме того, есть такие обертки как BackgroundWorker, File.AppendAllLines(...) И тому подобное. :-) Спасибо за подсказку. Буду гуглить. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2014, 13:36 |
|
Как ускорить запись в файл?
|
|||
---|---|---|---|
#18+
Изопропилкосяков много, в отсутвие arrayready цикл жрёт процессор почём зря, гораздо хуже, что доступ к ArrayReady непотокобезопасен Это то понятно что 50% проц времени жрется за зря. Вопрос в другом. Почему большинство массивов записывается нормально, а некоторые не записваются? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2014, 13:38 |
|
Как ускорить запись в файл?
|
|||
---|---|---|---|
#18+
webber81, к ArrayReady могут одновременно обратиться два потока с непредсказуемым результатом ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2014, 14:00 |
|
Как ускорить запись в файл?
|
|||
---|---|---|---|
#18+
Изопропилwebber81, к ArrayReady могут одновременно обратиться два потока с непредсказуемым результатом А чуть поподробней можно, применитьльно к моей проге? ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2014, 14:16 |
|
Как ускорить запись в файл?
|
|||
---|---|---|---|
#18+
webber81Дело в том, что массивы поступают с интервалом в 12мс. И каждый последующий должен быть записан до получения предыдущего.. В этом случае - неоптимально закрывать файл. Запись да, может быть вынесена в отдельный поток, но только один. Нельзя создавать новые - много лишних операций, точно не успеет переключиться. ... |
|||
:
Нравится:
Не нравится:
|
|||
21.01.2014, 15:37 |
|
|
start [/forum/topic.php?fid=20&fpage=131&tid=1403392]: |
0ms |
get settings: |
7ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
60ms |
get tp. blocked users: |
2ms |
others: | 316ms |
total: | 458ms |
0 / 0 |