Мне нужно создать действительно простое приложение в vb. В моем приложении есть кнопка и список. В моем приложении я должен запускать потоки и вставлять в listview имя и время выполняемого потока. Мой код начинается, когда я нажимаю на кнопке заправочнойВставить строки в список из потока
моего кода следующего
Private Sub btnThreading_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnThreading.Click
Try
For index = 0 To 3
Dim th As New Threading(index)
Me.Invoke(New DoStuffDelegate(AddressOf th.Run))
Next
lstText.View = View.Details
lstText.Columns.Add("Thread Name")
lstText.Columns.Add("Time")
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
И страница потокового следующей
Public Class Threading
Private threadName As String
Dim value As Date
Private Delegate Sub DoStuffDelegate()
Dim lockthis As New Object
Sub New(ByVal ThreadName As String)
Me.threadName = "Thread Number : " & ThreadName
End Sub
Public Sub Run()
For index = 0 To 3
Thread.Sleep(1000)
value = Date.Now
Console.WriteLine(threadName & " Time : " & value)
Dim item3 As New ListViewItem(Me.threadName)
item3.SubItems.Add(Me.value)
Form1.lstText.Items.AddRange(New ListViewItem() {item3})
Next
End Sub
End Class
, если я использую нить без делегата, таких как следующий
Dim th As New Threading(index) Dim trd = New Thread(AddressOf th.Run) trd.start()
, мое окно вывода показывает имена и темы, как это должно быть, например,
Номер темы: 1 Время: 15/15/2014 9:51:00
Номер темы: 0 Время: 15.09.2014 9:51: Номер 00
тема: 2 Время: 9/15/2014 9:51:00
Количество тема: 3 Время: 9/15/2014 9:51:00
но ничего в списке не показывать Посмотреть. но если я выбираю использовать делегат как следующий,
Dim th As New Threading(index)
Me.Invoke(New DoStuffDelegate(AddressOf th.Run))
он показывает следующее на выходе
Количество резьбы: 1 Время: Количество 9/15/2014 9:50:59
Thread : 0 Время: 15.09.2014 9:51:00
Номер темы: 2 Время: 15/15/2014 9:51:01
Номер темы: 3 Время: 15.09.2014 9:51:02
, и он показывает его в списке. Это работает, но не выполняет код в виде потока. Но в конце концов, когда я использую следующий код
Dim th As New Threading(index)
Dim trd = New Thread(AddressOf th.Run)
Me.Invoke(New DoStuffDelegate(AddressOf trd.Start))
, мое окно вывода отображает имена и темы, как это следует, например
Количество резьбы: 1 Время: 9/15/2014 9:51:00
Номер темы: 0 Время: 15/15/2014 9:51:00
Номер темы: 2 Время: 15/15/2014 9:51:00
Номер темы: 3 Время: 15.09.2014 9: 51:00
, но ничего не отображается в виде списка.
Я хочу, чтобы посмотреть список, чтобы показать это
Количество резьбы: 1 Время: 9/15/2014 9:51:00
Количество Тема: 0 Время: 9/15/2014 9:51:00 Количество
темы: 2 времени: 9/15/2014 9:51:00
Количество темы: 3 время: 9/15/2014 9:51:00
Все нити должны иметь то же самое время, все нити должны начинаться в одно и то же время, и они должны отображаться в моем списке.
Пожалуйста, помогите, я работал над этим как две недели, и я не нашел никакого решения!
Я пропустил время в конструкторе потоковой передачи, мой результат был следующий: Номер темы: 0 Время: 9/16/2014 9:42:40 Номер темы: 0 Время: 16.09.2014 9:42 : 40 AM Номер темы: 0 Время: 9/16/2014 9:42:44 Номер темы: 0 Время: 16.09.2014 9:42:48 Номер темы: 0 Время: 9/16/2014 9:42:52 AM –
Итак, у нас все еще есть одна и та же проблема, потоки не работают одновременно. –
Я посмотрел ближе к вашему коду, и я боюсь, что это в основном мусор. Вам нужно вернуться к чертежной доске. Вы знаете, для чего используется метод 'Invoke'? Весь смысл метода 'Invoke' заключается в том, чтобы выполнить метод в потоке, которому принадлежит элемент управления. Это означает, что вы каждый раз выполняете метод 'Run' в потоке пользовательского интерфейса. Нет дополнительных потоков, потому что вы их не создали. – jmcilhinney