Форум программистов, компьютерный форум, киберфорум
Наши страницы
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
 
Дядя Корней
302 / 244 / 48
Регистрация: 14.08.2014
Сообщений: 908
#1

Запись в файл в несколько потоков - Visual Basic .NET

04.07.2015, 22:21. Просмотров 706. Ответов 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 просьба не давать, лучше сразу пройдите мимо.
Мне нужно объяснение более простым пацанским человеческим языком. Есть ведь у нас здесь нормальные пацаны, я знаю.
http://www.cyberforum.ru/vb-net/thread443334.html
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.07.2015, 22:21
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Запись в файл в несколько потоков (Visual Basic .NET):

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

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

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

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

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

9
edward_freedom
1553 / 1432 / 302
Регистрация: 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
Дядя Корней
302 / 244 / 48
Регистрация: 14.08.2014
Сообщений: 908
05.07.2015, 12:05  [ТС] #3
edward_freedom, не помогло. Я не понимаю что написано на MSDN.
0
edward_freedom
1553 / 1432 / 302
Регистрация: 01.10.2011
Сообщений: 2,636
05.07.2015, 12:22 #4
Дядя Корней, учись понимать, несколько раз статью перечитывай, пробуй код, что он делает и как работает
0
Замабувараев
319 / 328 / 91
Регистрация: 18.12.2014
Сообщений: 674
Записей в блоге: 1
05.07.2015, 15:02 #5
Есть разного рода задачи.
1. Есть область памяти, позволяющая чтение и запись. Несколько потоков имеют к ней доступ, при этом одновременно могут читать сколько угодно потоков, но писать — только один.
2. Чтение и запись должен делать только один поток, остальные ожидают.
Какова ваша задача?
1
Дядя Корней
302 / 244 / 48
Регистрация: 14.08.2014
Сообщений: 908
05.07.2015, 16:44  [ТС] #6
Цитата Сообщение от Замабувараев Посмотреть сообщение
2. Чтение и запись должен делать только один поток, остальные ожидают.
Если это действительно так, значит я в корне делаю всё не верно.

Моя задача примерно в 20 потоков писать строки в тхт файл. Если так нельзя, то значит буду переделывать логику программы.
0
Замабувараев
319 / 328 / 91
Регистрация: 18.12.2014
Сообщений: 674
Записей в блоге: 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
Дядя Корней
302 / 244 / 48
Регистрация: 14.08.2014
Сообщений: 908
05.07.2015, 19:52  [ТС] #9
Ciberst, спасибо за пример с костыльно-велосипедным программированием, взял на заметку))
0
Замабувараев
319 / 328 / 91
Регистрация: 18.12.2014
Сообщений: 674
Записей в блоге: 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
Привет! Вот еще темы с решениями:

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

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

Запись массива в файл
Здравствуйте. Подскажите пожалуйста, как записать массив в файл,находилось как...

Запись в файл .txt
уже всю голову сломал(( студию знаю плохо, а нужно сделать что бы после...


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

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

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