2012-05-31 5 views
-2

У меня есть этот класс, и у меня есть цикл, который запускает несколько потоков из того же класса. Все это делается из основной формы.Обновление от нескольких потоков того же класса

Теперь я хочу обновить richtextbox на главном из этих классов.

Я пробовал эти begininvokes и т. Д. И т. Д., И ничего не работало, без ошибок, но без вывода.

Вот код для запуска нитей:

 Private PingObjects(100000) As Account 'Account is the class and login is the sub in it... 
     PingObjects(I) = New Account 
     Threads(I) = New Threading.Thread(AddressOf PingObjects(I).login) 
     Threads(I).IsBackground = True 
     Threads(I).Start() 

И обновить RTB, им с помощью MainForm.log.text = "....." ничего не происходит, нет ошибки. Я попытался использовать метод begin invoker.

+0

Не могли бы вы показать код для PingObjects.Login? (Кстати, я действительно надеюсь, что вы не планируете запускать 100000 потоков одновременно) – Steve

+0

Я уже написал это там. - В любом случае, снова: MainForm.log.text = "....." .Well, 100000 - это всего лишь номер, который я поставил ... многие из них не будут запущены даже на 1%, возможно ... но это не проблема! – HooCraX

+2

Вы не показываете достаточно кода. Ваш 'PingObjects (I)' предлагает цикл for, но вы его не показывали. Вы сказали, что использовали «begininvokes», но не показывали его. И, судя по всему, весь ваш метод 'login()' является 'MainForm.log.text =" ..... "', который не использует 'Control.Invoke' (или' BeginInvoke') и поэтому не будет обновлять ваши UI. Так что * пожалуйста *, напишите больше кода. – tcarvin

ответ

0

Найдено решение !!

Я нашел решение по другим кредитам на форуме: facebookdoom на HF

Delegate Sub AppenLogDelegate(ByVal update As String) 
Public Sub AppendLog(ByVal update As String) Implements Interface1.AppendLog 
    If log.InvokeRequired Then 
     log.Invoke(New AppenLogDelegate(AddressOf AppendLog), update) 
    Else 
     log.AppendText(update & vbCrLf) 
    End If 
End Sub 

В MainForm

сделать новый класс интерфейса: -

Открытый интерфейс Interface1 Sub AppendLog (обновление ByVal Как String) Конечный интерфейс

Поместите это в класс резьбы:

Private ReadOnly _form Как Interface1

Public Sub (форма ByVal Как форма) Новый _form = форма End Sub

Использование: -

_form.AppendLog ("аааааа")

1

Обязательно,
Обновление элементов управления от резьбы, отличной от основной резьбы пользовательского интерфейса, должно выполняться с помощью Control.Invoke().
я поставил что-нибудь вместе для вас попробовать

' at the form level 
Private Delegate Sub UpdateRTB(ByVal Msg As String) 

' your thread function 
Private Sub Login() 
    Dim Data As String = "your message for the RTB" 
    rtb.Invoke(New UpdateRTB(AddressOf MainForm.UpdateRTBMessage), Data) 
End Sub 

' the UI updater. 
Private Sub UpdateRTBMessage(ByVal msg as String) 
    rtb.Text = msg 
End Sub 

Я предполагаю, что здесь, что ваш RichTextBox назван RTB

+0

Нет, не работает:/Я помещаю это в Account.login(): Dim Data As String = "ваше сообщение для RTB" MainForm.log.Invoke (New UpdateRTB (AddressOf MainForm.UpdateRTBMessage), данные) И эта функция в mainform как общедоступная общая учетная запись coz также является общедоступной, поэтому так. – HooCraX

+0

@HooCraX - позаботиться о том, чтобы не работать ошибка? Если так, то, что это? Для того, чтобы кто-нибудь мог нам помочь, нам нужна дополнительная информация. –

+0

Я подозреваю, что проблема связана с переменной MainForm. Из комментариев @HooCraX кажется, что это экземпляр глобальной формы, доступный в VB.NET для упрощения преобразования из VB6, и это не переменная, созданная с помощью New. Однако я не нашел никаких намеков на то, как это связано с проблемой. – Steve

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