2014-09-16 2 views
0

Мне нужно создать действительно простое приложение в 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

Что вы добавляете в ListView? Имя и время, не так ли? Итак, когда вы вызываете метод в потоке пользовательского интерфейса, pas имя И время. Не ждите, пока вы будете в потоке пользовательского интерфейса, чтобы получить время, потому что, очевидно, это будет позже.

+0

Я пропустил время в конструкторе потоковой передачи, мой результат был следующий: Номер темы: 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 –

+0

Итак, у нас все еще есть одна и та же проблема, потоки не работают одновременно. –

+0

Я посмотрел ближе к вашему коду, и я боюсь, что это в основном мусор. Вам нужно вернуться к чертежной доске. Вы знаете, для чего используется метод 'Invoke'? Весь смысл метода 'Invoke' заключается в том, чтобы выполнить метод в потоке, которому принадлежит элемент управления. Это означает, что вы каждый раз выполняете метод 'Run' в потоке пользовательского интерфейса. Нет дополнительных потоков, потому что вы их не создали. – jmcilhinney

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