2015-09-18 3 views
0

У меня есть многопоточная программа VB.net. и я хочу пройти через каждый поток и получить сеанс от каждого из них.Сохранить сеанс из рабочего потока при закрытии

вот код, который создает потоки.

Sub Run(): 
    Timer1.Enabled = True 
    AddHandler LoginTimer.Elapsed, AddressOf doWork 
    LoginTimer.Interval = 500 
    LoginTimer.Enabled = True 
End Sub 

и вот DoWork() к югу:

sub doWork() 
    For id = 0 to val(textbox1.text) ' get how many thread should we run 
       Dim th As New Thread(AddressOf Work) ' what the threads should do. 
       th.IsBackground = True 
       th.Start() 
    Next id 

Теперь каждый раз, когда я закрываю программу, потоки стали прерваны, и я потерял все вещи, что эти потоки работают на. Итак, я хочу сохранить сеансы. и в следующий раз, когда я запустил, я просто «возобновил» его, загрузив сеансы. Что-то вроде:

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing 
    Dim sessions As New List(Of String) 
    For Each thread In xxxx ' here where should I do a loop through the running threads 
     sessions.Add(thread.session) ' get the session from the thread 
    Next thread 
End Sub 

Заранее спасибо

EDIT: Я сумел исправить мою проблему, создав «Public Shared ShoulIupadteNow как Boolean», так как резьбе я работаю в непрерывном цикле они все проверка времени, если значение Boolean установлено в true. и когда он (я обычно нажимаю на кнопку, которая устанавливает ее в true в моей форме), она начинает обновляться, имея общедоступные общие lstsessions в качестве нового hashset (строки) таким образом, у меня не будет повторяющихся сеансов и после завершения всех потоков обновляя, я просматриваю все содержимое хэшета, а затем сохраняю его в txt-файлах.

+0

Когда вы закрываете приложение, все делается. Если вам нужно возобновить операцию при следующем запуске, вам нужно будет сохранить свой «сеанс» в более постоянном хранилище - например, в базе данных SQL или XML-файле. – InbetweenWeekends

+0

Это именно то, что я пытаюсь сделать. но как я могу получить эти сессии в базе данных SQL или XML. Мне нужно получить их из работающих потоков, а затем сохранить их. –

+0

Извините, что вы издеваетесь немного расплывчато, поэтому мой ответ также немного общий. Отправной точкой будет запись любого объекта, который вы накладываете на стол в начале вашего метода «Работа» , и удалите его в конце 'Work'.Когда вы закрываете форму во время выполнения этих потоков, восстановленные будут вашей очереди на обработку. Form_Load (или где-нибудь еще) может затем загрузить оставшиеся/оставленные записи из предыдущего закрытия и обработать их, удалив каждый, когда это будет сделано. – InbetweenWeekends

ответ

0

Если ваша проблема заключается в сохранении материала из каждого потока, вы можете сохранить нужные данные в общедоступных переменных внутри верхнего класса, который вызывает каждый поток. Например, у меня есть класс под названием controlador внутри GUI класса. Этот класс обрабатывает другие потоки. Когда есть информация о других потоках, которые я хочу передать в GUI класса, я сохраняю информацию внутри атрибутов controllerador, а затем вызываю атрибуты через GUI класса. Я не знаю, сделал ли я себя ясно. Единственная проблема заключается в том, что вы хотите обновить элемент управления внутри GUI класса из одного из других потоков. Если это ваш случай, вы должны иметь такие методы, как это в классе GUI:

Delegate Sub SetDebugLabel_Delegate(ByVal lbl As Label, ByVal text As String) 

Public Sub SetDebugLabel_ThreadSafe(ByVal lbl As Label, ByVal text As String) 
    If lbl.InvokeRequired Then 
      Dim MyDelegate As New SetDebugLabel_Delegate(AddressOf SetDebugLabel_ThreadSafe) 
      Me.Invoke(MyDelegate, New Object() {lbl, text}) 
    Else 
     lbl.Text = text 
    End If 
End Sub 

Затем вы должны использовать внутри сделать работу суб-то вроде этого:

SetDebugLabel_ThreadSafe(Me.lblDataServer, ctrl.dTempo) 

Где Ctrl класс controlador инстанцирован.

Если вам нравится подход XML, вы можете сохранить данные, которые вы хотите, в datatable, а затем экспортировать в XML.

Один из способов можно увидеть в https://msdn.microsoft.com/en-us/library/system.data.datatable.writexml(v=vs.110).aspx или вы можете сделать это следующим образом:

Dim settings As XmlWriterSettings = New XmlWriterSettings() 
    settings.Indent = True 


Using writer As XmlWriter = XmlWriter.Create(caminho & "alarmes.xml", settings) 

    ' Begin writing. 
    writer.WriteStartDocument() 
    writer.WriteStartElement("CNCO") ' Root. 

    With Login.user.DB1.dsDados.Tables("Lista") 
     For i As Integer = 0 To .Rows.Count - 1 
       writer.WriteStartElement("Duto") 
       writer.WriteElementString("Nome", "Alarmes") 
       writer.WriteElementString("TAG", .Rows(i)("TAG")) 
       writer.WriteEndElement() 
     Next 

     ' End document. 
     writer.WriteEndElement() 
     writer.WriteEndDocument() 

    End With 
End Using 

Для чтения XML, просто читать путь (Arquivo это строка путь) и восстановить данные в DataTable. Один из способов можно сделать следующим образом:

With Login.user.DB1.dsDados 
      .Tables("Lista").Clear() 
      .ReadXml(arquivo) 
      .Tables(0).DefaultView.Sort = "TAG DESC" 
End With 
+0

Я думал о создании открытого общего списка в форме1, а затем продолжал его обновлять. Но это больше потребляло процессор, и именно это я и делал, чтобы сделать программу более легкой. так что это мой план B, если никто не знает, как это сделать :) –

+0

Поскольку никто не ответил, и мне удалось исправить свою проблему, я помету ваш ответ как правильно. и я отредактирую свое сообщение, чтобы упомянуть, как я его исправляю :) –

Смежные вопросы