powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как ускорить запись в файл?
10 сообщений из 10, страница 1 из 1
Как ускорить запись в файл?
    #38531460
webber81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть прога.
Она записывает в файл массивы с интервалом 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);
}
}
}
}
...
Рейтинг: 0 / 0
Как ускорить запись в файл?
    #38531470
webber81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Прикрепил архив с прогой
...
Рейтинг: 0 / 0
Как ускорить запись в файл?
    #38531485
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
webber81,

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
private void Run1()
		{
			// цикл на 6000 массивов
			do
			{
				// записываем 1 массив и инкрементируем счетчик
				if (ArrayReady == true)
				{
					saveToFile();
					Count++;
					ArrayReady = false; 
				}
			} while (Count < 1000);
		}



У вас ArrayReady в цикле блокирует вызов функции saveToFile();

Вы вроде бы хотите 1000 раз цикл прокрутить, а реально выходит только один.

Но это произошло потому, что вы с дизайном намудрили.
Зачем вообще ArrayReady ? Блокирует нажатие кнопки, если массивы не готовы? Так лучше наоборот сделать - перед выполнением проверить, что все готово, и если нет - уведомить кого нужно.

:-)
...
Рейтинг: 0 / 0
Как ускорить запись в файл?
    #38531490
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
косяков много, в отсутвие arrayready цикл жрёт процессор почём зря, гораздо хуже, что доступ к ArrayReady непотокобезопасен
...
Рейтинг: 0 / 0
Как ускорить запись в файл?
    #38531493
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129,

Кроме того, есть такие обертки как BackgroundWorker,
File.AppendAllLines(...)
И тому подобное.

:-)
...
Рейтинг: 0 / 0
Как ускорить запись в файл?
    #38532993
webber81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
D129D129,

Зачем вообще ArrayReady ? Блокирует нажатие кнопки, если массивы не готовы? Так лучше наоборот сделать - перед выполнением проверить, что все готово, и если нет - уведомить кого нужно.

:-)
Дело в том, что массивы поступают с интервалом в 12мс.
И каждый последующий должен быть записан до получения предыдущего.
D129D129,

Кроме того, есть такие обертки как BackgroundWorker,
File.AppendAllLines(...)
И тому подобное.

:-)
Спасибо за подсказку. Буду гуглить.
...
Рейтинг: 0 / 0
Как ускорить запись в файл?
    #38532997
webber81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропилкосяков много, в отсутвие arrayready цикл жрёт процессор почём зря, гораздо хуже, что доступ к ArrayReady непотокобезопасен
Это то понятно что 50% проц времени жрется за зря.
Вопрос в другом. Почему большинство массивов записывается нормально, а некоторые не записваются?
...
Рейтинг: 0 / 0
Как ускорить запись в файл?
    #38533044
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
webber81,
к ArrayReady могут одновременно обратиться два потока с непредсказуемым результатом
...
Рейтинг: 0 / 0
Как ускорить запись в файл?
    #38533067
webber81
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Изопропилwebber81,
к ArrayReady могут одновременно обратиться два потока с непредсказуемым результатом
А чуть поподробней можно, применитьльно к моей проге?
...
Рейтинг: 0 / 0
Как ускорить запись в файл?
    #38533175
Фотография D129
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
webber81Дело в том, что массивы поступают с интервалом в 12мс.
И каждый последующий должен быть записан до получения предыдущего..

В этом случае - неоптимально закрывать файл.
Запись да, может быть вынесена в отдельный поток, но только один. Нельзя создавать новые - много лишних операций, точно не успеет переключиться.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Как ускорить запись в файл?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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