Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
Дядя Корней
326 / 266 / 52
Регистрация: 14.08.2014
Сообщений: 954
1

Запись в файл в несколько потоков

04.07.2015, 22:21. Просмотров 752. Ответов 9
Метки нет (Все метки)

Всем привет!
Ребята, нужна помощь.
Столкнулся сейчас с проблемой, не знаю как ее лучше решить.
Потоки для меня довольно сложная для понимания тема, да и вообще смотрю по форуму, информации по ним не особо то много, в основном примитивные примеры, ну да бог с ним, информация дело наживное, всё еще впереди.

Суть.
Есть потоки, ~ 20 потоков.
Эти потоки должны писать данные в файл. Тут-то и случилась засада. Как я понял, проблема в том, что потоки мешают друг другу работать и программа из-за этого вылетает. Скорее всего когда один из потоков пишет информацию в файл, то другие потоки не могут получить доступ к файлу и из-за этого происходит вылет программы.

Вот код:

vb.net
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button3.Click
        Dim threadsList As New List(Of Thread)
 
        For i = 0 To 20
            Dim thread As New Thread(AddressOf SaveToFile)
            thread.IsBackground = True 
            ThreadsList.Add(thread) 
            thread.Start()
        Next
        
    End Sub
    
    
    Public sub SaveToFile()
    
    '... какой-то код
    
      Dim f1 As New StreamWriter(Application.StartupPath + "\Data\" + "file.txt", True, System.Text.Encoding.UTF8)
         f1.Write(massString)
         f1.Close()
    End Sub
Вопрос.
Как с помощью 20-ти потоков можно быстро писать в файл, чтобы потоки не мешали друг другу? Желательно пример с кодом.

Информацию в виде ссылок на замудреный MSDN просьба не давать, лучше сразу пройдите мимо.
Мне нужно объяснение более простым пацанским человеческим языком. Есть ведь у нас здесь нормальные пацаны, я знаю.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2015, 22:21
Ответы с готовыми решениями:

Запись в файл - проверить, не идет ли в него запись, чтобы не генерировалось исключение
Доброе время суток! Вот такой пример: Imports System Imports System.IO ...

Запись в несколько текстовых файлов
Можно ли как нибудь реализовать это? Например. Имеется 5 текстовых файлов. В...

Чтение и запись в файл
как произвести чтение и запись в файл из программы например: language =...

Запись в текстовый файл
При нажатии на кнопку записать в текстовый файл: текущую дату и время |...

Запись массива в файл
Столкнулся с проблемой. Не втыкаю как записать массив в .dat файл. Массив из...

9
edward_freedom
1555 / 1434 / 303
Регистрация: 01.10.2011
Сообщений: 2,636
04.07.2015, 22:40 2
Дядя Корней, Читай, должно помочь
https://msdn.microsoft.com/en-us/library/3a86s51t.aspx
https://msdn.microsoft.com/ru-ru/library/ms173179.aspx
1
Дядя Корней
326 / 266 / 52
Регистрация: 14.08.2014
Сообщений: 954
05.07.2015, 12:05  [ТС] 3
edward_freedom, не помогло. Я не понимаю что написано на MSDN.
0
edward_freedom
1555 / 1434 / 303
Регистрация: 01.10.2011
Сообщений: 2,636
05.07.2015, 12:22 4
Дядя Корней, учись понимать, несколько раз статью перечитывай, пробуй код, что он делает и как работает
0
Замабувараев
320 / 329 / 91
Регистрация: 18.12.2014
Сообщений: 678
Записей в блоге: 1
05.07.2015, 15:02 5
Есть разного рода задачи.
1. Есть область памяти, позволяющая чтение и запись. Несколько потоков имеют к ней доступ, при этом одновременно могут читать сколько угодно потоков, но писать — только один.
2. Чтение и запись должен делать только один поток, остальные ожидают.
Какова ваша задача?
1
Дядя Корней
326 / 266 / 52
Регистрация: 14.08.2014
Сообщений: 954
05.07.2015, 16:44  [ТС] 6
Цитата Сообщение от Замабувараев Посмотреть сообщение
2. Чтение и запись должен делать только один поток, остальные ожидают.
Если это действительно так, значит я в корне делаю всё не верно.

Моя задача примерно в 20 потоков писать строки в тхт файл. Если так нельзя, то значит буду переделывать логику программы.
0
Замабувараев
320 / 329 / 91
Регистрация: 18.12.2014
Сообщений: 678
Записей в блоге: 1
05.07.2015, 18:25 7
Конечно неверно. Вот сложный пример.
Первый поток открыл текстовый файл и пишет туда «Hello World! This is a sample text.», второй поток в это время открывает файл и пишет туда «Привет, мир!» и завершается быстрее первого потока. Но так как первый поток не успел завершить операцию записи, а второй поток уже пишет данные, то в итоге получается «HellПривет, Мир!ample text.».
Решение проблемы в том, что записывать в файл может только один поток одновременно либо записывать данные неперекрывающимися блоками.
0
Ciberst
507 / 420 / 19
Регистрация: 16.12.2010
Сообщений: 939
05.07.2015, 19:20 8
Лучший ответ Сообщение было отмечено Дядя Корней как решение

Решение

Дядя Корней, можно, например, обратиться к костыльно-велосипедному программированию, и сделать, например, вот так:
vb.net
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
Public Class Form1
    Private Shared rwl As New System.Threading.ReaderWriterLock()
    Dim file As New IO.StreamWriter("D:\123321.txt")
    Dim Threads As New List(Of Threading.Thread) ' Лист потоков
    Dim ThreadsCount As UInteger = 20
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        ' Создаем потоки
        For i = 0 To ThreadsCount - 1
            Dim a As New Threading.Thread(AddressOf threadFunc)
            a.IsBackground = True
            Threads.Add(a)
        Next
        For i = 0 To ThreadsCount - 1
            Threads(i).Start(i)
        Next
    End Sub
    Private Sub threadFunc(ByVal i As Integer)
        For j = 0 To 100
            writeIntoFile("cyberforum.ru", i)
        Next
    End Sub
    Dim writes As Integer
    Private Sub writeIntoFile(ByRef str As String, ByVal i As Integer)
        Try
            rwl.AcquireWriterLock(1000)
            Try
                file.WriteLine(CStr(i) + " " + str)
                System.Threading.Interlocked.Increment(writes)
            Finally
                rwl.ReleaseWriterLock()
            End Try
        Catch ex As Exception
            ' Interlocked.Increment(writerTimeouts)
            Debug.WriteLine("error" + CStr(i))
        End Try
    End Sub
 
    Private Sub Form1_FormClosing(sender As Object, e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        file.Close()
    End Sub
End Class

Не по теме:


PS файл сохраняется по закрытию формы

1
Дядя Корней
326 / 266 / 52
Регистрация: 14.08.2014
Сообщений: 954
05.07.2015, 19:52  [ТС] 9
Ciberst, спасибо за пример с костыльно-велосипедным программированием, взял на заметку))
0
Замабувараев
320 / 329 / 91
Регистрация: 18.12.2014
Сообщений: 678
Записей в блоге: 1
06.07.2015, 07:43 10
Слишком много кода, который можно спокойно заменить оператором SyncLock:
vb.net
1
2
3
4
5
6
7
Private lockThis As New Object 
 
Public Sub Process()
    SyncLock lockThis
        ' Здесь код для записи данных в файл
    End SyncLock 
End Sub
1
06.07.2015, 07:43
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.07.2015, 07:43

Запись текст в файл
Нужно чтобы в текстовый фаил c:\\text.txt записывалось 123 как сделать

Запись XElement в файл
Создаю XML с помощью класса XElement: Dim contact1 As XElement = _ ...

Запись в файл на хостинг
Нужно записывать данные в конец файла на хостинге, а также чтение из этого...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru