1 / 1 / 2
Регистрация: 10.11.2013
Сообщений: 126
1

Как осуществить запись(дозапись) в файл в отдельном потоке и закрыть его после записи?

15.08.2016, 11:41. Показов 2162. Ответов 5
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Вопрос в названии темы! Подробнее планирую записывать(дозаписывать) в файл массив double[1000,] doubleArray. Этот массив будет постепенно меняться, после заполнения всех строк, значения будут перезаписывать информацию в нулевой, первой и т.д. строках. И после каждого заполнения всех строк хотелось бы делать запись в отдельном потоке. Но пусть у меня есть уже заполненный массив, как именно открыть запись в соседнем неблокирующем потоке?

Если сделаю сам, выложу свой вариант, но задавая вопрос здесь жду и помощи сообщества!

Добавлено через 11 минут
.NET 4.5

Добавлено через 1 минуту
ой вернее .NET 4
0
15.08.2016, 11:41
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.08.2016, 11:41
Ответы с готовыми решениями:

Как осуществить дозапись в файл
Здравствуйте. Столкнулся с очередной проблемой. Моя задача - записать в файл данные. Самый простой пример: private void...

Как осуществить дозапись в уже имеющийся файл
Здравствуйте Как добавить запись в файл с расширением "txt" но при этом чтобы другие не удалялись ? И также отдельной командой...

Создать приложение, в отдельном потоке вычисляющее значение w и непрерывно обновляющее его в потоке
Ребят, с потоками не работал не когда. Есть задание , я понимаю что хотят, а вот как сделать потоками хз . Создайте приложение, в...

5
Эксперт .NET
 Аватар для Rius
11302 / 7247 / 1607
Регистрация: 25.05.2015
Сообщений: 21,917
Записей в блоге: 14
15.08.2016, 12:12 2
System.Timers.Timer совсем не ясно, как работать можно переделать.
0
1 / 1 / 2
Регистрация: 10.11.2013
Сообщений: 126
15.08.2016, 15:53  [ТС] 3
А что-нибудь попроще? (это я буду разбирать неделю)
0
Эксперт .NET
 Аватар для Rius
11302 / 7247 / 1607
Регистрация: 25.05.2015
Сообщений: 21,917
Записей в блоге: 14
15.08.2016, 15:54 4
Вот свеженькое: Получение данных с Com порта и сохранение их в txt
Только SerialPort выпилить и готово.
1
1 / 1 / 2
Регистрация: 10.11.2013
Сообщений: 126
15.08.2016, 16:03  [ТС] 5
Конечно, спасибо и за это, но предполагаю пока не смогу воспользоваться

Добавлено через 36 секунд
Это к предыдущему

Добавлено через 5 минут
Начну сам пока читать теорию и пробовать написать, возможно чуть разберусь и примеры пригодятся.
0
1 / 1 / 2
Регистрация: 10.11.2013
Сообщений: 126
25.08.2016, 13:46  [ТС] 6
По заданному вопросу, написал код, использующий ba-dWorker.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Threading;
using System.IO;
 
namespace WindowsFormsApplication2
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        double[] ArrayStr = new double[10];
        // если передается меньше параметров, то остальные ячейки строки заполняются нулями
        // каждая новая строка заполняется по тику таймера
        double[,] AllArray1 = new double[1000, 80];
        double[,] AllArray2 = new double[1000, 80];
        int counter = 0;
        long n = 0;
        byte shift = 0;
 
        string path = Application.StartupPath + @"\arrays\array.txt";
                
        private void timer1_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
        {
            if (n > 0 && n % 5 == 0)
            {
                ++shift;
                path = Application.StartupPath + @"\arrays\array" + shift.ToString() + ".txt";
            }
 
 
            for (int i = 0; i < ArrayStr.Length; i++)
            {
                ArrayStr[i] = counter;
            }
 
            // для четных чисел n запись в первый массив
            if (n % 2 == 0 && counter <= 999)
            {
                for (int j = 0; j <= AllArray1.GetUpperBound(1); j++)
                {
                    if (j <= (ArrayStr.Length - 1)) AllArray1[counter, j] = ArrayStr[j];
                    else AllArray1[counter, j] = 0;
                }
 
                if (counter == 999)             // если массив заполнен
                {
                    counter = 0;
                    n += 1;
 
                    // Start the asynchronous operation.
                    backgroundWorker1.RunWorkerAsync(AllArray1);    // записываем информацию в файл в фоновом потоке
                }
            }
 
            // для нечетных чисел n запись во второй массив
            if (n % 2 != 0 && counter <= 999)
            {
                for (int j = 0; j <= AllArray2.GetUpperBound(1); j++)
                {
                    if (j <= (ArrayStr.Length - 1)) AllArray2[counter, j] = ArrayStr[j];
                    else AllArray2[counter, j] = 0;
                }
 
                if (counter == 999)             // если массив заполнен
                {
                    counter = 0;
                    n += 1;
 
                    // Start the asynchronous operation.
                    backgroundWorker1.RunWorkerAsync(AllArray2);    // записываем информацию в файл в фоновом потоке
                }
            }
 
            ++counter;
 
        }
 
        
        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            ArrayWriter((double[,])e.Argument);
        }
        
        
        void ArrayWriter(double[,] Arr)
        {
            using (StreamWriter sw = new StreamWriter(path, true))
            {
                for (int i = 0; i <= Arr.GetUpperBound(0); i++)
                {
                    for (int j = 0; j <= Arr.GetUpperBound(1); j++)
                    {
                        sw.WriteLine(String.Format("{0}\t{1}\t{2}", i, j, Arr[i, j]));
                    }
 
                }
                sw.Close();
            }
        }
 
       
 
    }
}
Прим.:Для записи таблиц в папку arrays/ надо предварительно её создать, во всяком случае у меня не работает иначе!

Но не получается корректно раскидывать информацию по файлам: имеется ввиду, что через каждые пять, записанных
в файл таблиц, я хотел бы создавать для записи новый текстовый файл. Файл создается, но хотелось бы, чтобы их названия шли по порядку: array, array1, array2, array3.

Добавлено через 1 час 10 минут
Вопрос с синхронизацией видимо тоже , дает баг, но интересует именно корректная смена имени пути.

Добавлено через 2 часа 41 минуту
Видимо из-за проблем с синхронизацией и были все сложности, написал так:
C#
1
2
3
4
5
6
7
8
private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (n > 4 && n % 5 == 0)
            {
                ++shift;
                string local = Application.StartupPath + @"\arrays\array" + shift.ToString() + ".txt";
                path = local;
            }
0
25.08.2016, 13:46
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
25.08.2016, 13:46
Помогаю со студенческими работами здесь

Как осуществить дозапись в файл
Проблема следующая: Когда запускаю следующую программу и печатаю в файл example.dat несколько раз (После каждого раза вставляю...

Как осуществить дозапись в файл
private void button1_Click(object sender, EventArgs e) { int index = listView1.Items.Add(textBox1.Text).Index; ...

Объсните, почему значение переменной в отдельном потоке другое и как его поменять?
вот фрагмент кода добавил msgbox и в первом случае переменная изменена а вот уже в новом потоке значение переменной такое как при...

Осуществить дозапись в файл
Подготовить файл, содержащий набор символов, и написать программу, добавляющую в этот файл еще несколько строк с символами.

Осуществить дозапись в файл
Здравствуйте. У меня такая проблема. Пишу игру, в ней надо записывать результаты игры. Как бы создаю таблицу рекордов. Записываю в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Почему могут не шифроваться русские символы в Java
Wired 17.02.2025
При разработке на Java нередко возникают сложности с шифрованием русских символов. Эта проблема особенно актуальна для разработчиков, создающих программное обеспечение для русскоязычной аудитории. . . .
Отличия ОС для x86_64 и ARM
Wired 17.02.2025
На данный момент сосуществуют две основные архитектуры процессоров - x86_64 и ARM. Эти архитектуры имеют принципиально разные подходы к организации вычислений и обработке данных, что накладывает. . .
Многопоточность в Python: как использовать Thread
bytestream 17.02.2025
Поток выполнения (thread) - это наименьшая последовательность инструкций, которая может управляться планировщиком операционной системы. Представьте себе, что ваша программа - это книга, а потоки -. . .
Как воспроизвести Race Condition в Python
bytestream 17.02.2025
В многопоточном программировании существует множество подводных камней, и одним из самых коварных является состояние гонки (Race Condition). Этот термин описывает ситуацию, когда результат выполнения. . .
Ошибка "node: --openssl-legacy-provider is not allowed in NODE_OPTIONS"
bytestream 17.02.2025
Каждый разработчик рано или поздно сталкивается с ситуацией, когда при запуске проекта Node. js неожиданно выскакивает ошибка "node: --openssl-legacy-provider is not allowed in NODE_OPTIONS". Это. . .
Ошибка pip Python "AttributeError­: module 'lib' has no attribute 'OpenSSL_add_al­l_algorit­hms'"
bytestream 17.02.2025
При разработке на Python частенько сталкиваешься с разными сюрпризами, но ошибка AttributeError: module 'lib' has no attribute 'OpenSSL_add_all_algorithms' - это что-то особенное. Знаете, это как. . .
Сообщение Play Store "You must complete the advertising ID declaration before you can release an app that targets"
bytestream 17.02.2025
Рекламный идентификатор - это уникальный, но восстанавливаемый строковый идентификатор для каждого устройства Android. Думаю, вы удивитесь, но даже если ваше приложение не показывает рекламу. . .
Отличия App Router от Pages Router в Next.js
bytestream 17.02.2025
Next. js прошел длинный путь развития, и одним из самых значительных изменений стало появление App Router - революционного подхода к организации маршрутизации в приложении. Этот новый способ пришел на. . .
Топ10 лучших фреймворков JavaScript для изучения в 2025
bytestream 16.02.2025
В современной веб-разработке JavaScript занимает особое место, являясь одним из наиболее востребованных языков программирования. По мере развития веб-технологий появляется все больше фреймворков,. . .
Temporal в JavaScript - новый формат даты и времени
bytestream 16.02.2025
В мире JavaScript скоро произойдет значимое событие - появление нового встроенного объекта Temporal, который призван полностью заменить устаревший объект Date. Это революционное изменение в работе с. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru