Из потока в поток

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

VVV2008
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 15.04.2008 (Вт) 10:49

Из потока в поток

Сообщение VVV2008 » 15.04.2008 (Вт) 12:41

Хотелось бы получить совет или предложение по ситуации:
Есть главная форма FormA на ней Label1. При нажатии кнопки bStart подключается OLE-сервер MI. С него постоянно считывается информация (строка), которую необходимо выводить в Label1.
Для считывания с сервера сформирован ComClass1 (CallBack).
В результате информация с сервера благополучно считывается, но вывести строку на форму не получается. Прерывания в явном виде не происходит, но из комментариев следует, что нельзя
напрямую обращаться к объекту созданному в другом потоке.
Код: Выделить всё
================================
Public Class FormA
    Inherits System.Windows.Forms.Form
    Public Delegate Sub myD(ByVal s As String, ByRef ff As Form)
    Public WithEvents MIClass As New ComClass1
    Public MIDetail As Object
Private Sub MIClass_TrashChenge(ByVal sourse As ComClass1, _
   ByVal e As ComClass1EventArgs) Handles MIClass.Trash_Change
'обработка события изменение строки в объекте MIClass
        Dim ss As String
        Dim mm As New myD(AddressOf AddStr)
        ss = MIClass.Trash
        'Me.Label1.text = ss      'не проходит
        'CType(Me.Controls("Label1"), Object).Text = ss   'не проходит
        mm.Invoke(ss, Me)   'не проходит
End Sub

Private Sub AddStr(ByVal s As String, ByRef ff As Form)
        'ff.Label1.text = ss      'не проходит
        CType(ff.Controls("Label1"), Object).Text = ss   'не проходит
        Application.DoEvents()
End Sub

Private Sub bStart_Click(ByVal eventSender As System.Object, _
   ByVal eventArgs As System.EventArgs) Handles bStartMI.Click
        MIDetail = CreateObject("MI.Application")
        MIDetail.SetCallBack(MIClass)
End Sub

.................................................

End Class

================================

Public Delegate Sub Trash_ChangeEventHandler(ByVal Sourse As ComClass1, _
   ByVal e As ComClass1EventArgs)
<ComClass(ComClass1.ClassId, ComClass1.InterfaceId, ComClass1.EventsId)> _
Public Class ComClass1
    Public Trash As String
#Region "COM GUIDs"
    Public Const ClassId As String = "25294131-3bc4-45c4-890e-3ddcd983e1ed"
    Public Const InterfaceId As String = "89878a92-32d5-435a-a8d2-bd077128c86d"
    Public Const EventsId As String = "554800cf-6d6d-4f7b-b9d8-a68efa691bfd"
#End Region
    Public Event Trash_Change As Trash_ChangeEventHandler
Public Sub New()
        MyBase.New()
End Sub
Public Sub SetStr(ByVal cb As String)
'считывает строку с OLE-сервера
        Trash = cb
        showFF()
End Sub
    Public Sub showFF()
        'CType(ff.Controls("lblStatBar"), Object).Text = Trash
        Static gg As String
        If gg <> Trash Then
            Dim Args As New ComClass1EventArgs
            RaiseEvent Trash_Change(Me, Args)
        End If
        gg = Trash
    End Sub
End Class
Public Class ComClass1EventArgs
    Inherits EventArgs

End Class
=======================================
VVV2008

Ramzes
Скромный человек
Скромный человек
Аватара пользователя
 
Сообщения: 5004
Зарегистрирован: 12.04.2003 (Сб) 11:59
Откуда: Из гробницы :)

Сообщение Ramzes » 15.04.2008 (Вт) 13:59

через делегаты пройдет :)

C# писал(а):private delegate void m_setLabelText(Label lbl, string text);
private m_setLabelText Set_lbl_text = new m_setLabelText(setLabelText)

private static void setLabelText(Label lbl, string text)
{
lbl.Text = text;
}

//из другого потока
label1.invoke(Set_lbl_text, label1, "Hello World");

VVV2008
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 15.04.2008 (Вт) 10:49

Сообщение VVV2008 » 16.04.2008 (Ср) 13:22

Спасибо за предложения. Однако решение оказалось на удивление простым. По крайней мере задачу это решает.

Код: Выделить всё
=======================================
Public Class Class1
    Private Trash As String
    Private myForm As FormA

    Public Sub SetStr(ByVal cb As String)
        Trash = cb
        On Error Resume Next
        myForm.ToolStripStatusLabel1.Text = Trash
        On Error GoTo 0
    End Sub
    Public Sub New(ByVal myFormA As FormA)
        MyBase.New()
        myForm = myFormA
    End Sub
End Class
========================================
VVV2008


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 97

    TopList