vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Mails senden, abrufen und decodieren - ganz easy ;-)  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2024
 
zurück

 Sie sind aktuell nicht angemeldet.Funktionen: Einloggen  |  Neu registrieren  |  Suchen

VB.NET - Ein- und Umsteiger
Re: Variable "ByRef" speichern?! 
Autor: Melkor
Datum: 22.05.08 11:06

Immerhin, hier ist Beispielcode fürs Beispiel. Hier wird ein Timer verwendet anstatt COM Port (Timer.Elapsed entspricht COM Port Data Received).
Public Class AsyncServer
 
    Public Shared Server As New AsyncServer
 
    Public Class WorkItem
        Public OutMessage As String
        Public InMessage As String
        Public Caller As Form
        Public Completed As CallBack
    End Class
 
    Public Class WorkItemCompletedEventArgs
        Inherits System.EventArgs
        Public wi As WorkItem
        Public Sub New(ByVal wi As WorkItem)
            Me.wi = wi
        End Sub
    End Class
 
    Public Delegate Sub CallBack(ByVal sender As Object, ByVal e As _
      WorkItemCompletedEventArgs)
 
    Private _closeDown As Boolean
    Private _workQueue As New Queue(Of WorkItem)
    Private _workEvent As New Threading.AutoResetEvent(False)
    Private _received As New Threading.AutoResetEvent(False)
    Private _thread As New Threading.Thread(AddressOf run)
 
    Private Function getWorkItem() As WorkItem
        Dim nextWi As WorkItem = Nothing
        Do
            SyncLock _workQueue
                If _workQueue.Count > 0 Then
                    nextWi = _workQueue.Dequeue()
                End If
            End SyncLock
            If nextWi Is Nothing Then
                _workEvent.WaitOne()
            End If
            Threading.Thread.MemoryBarrier()
        Loop While nextWi Is Nothing And Not _closeDown
        Return nextWi
    End Function 'getWorkItem() 
 
    Public Sub PostWorkItem(ByVal wi As WorkItem)
        SyncLock _workQueue
            _workQueue.Enqueue(wi)
            If _workQueue.Count = 1 Then
                ' Post (maybe) waiting work thread 
                _workEvent.Set()
            End If
        End SyncLock
    End Sub 'PostWorkItem()
 
    Public Sub Close()
        _closeDown = True
        Threading.Thread.MemoryBarrier()
        _workEvent.Set()
        _received.Set()
        Threading.Thread.Sleep(100) ' or _thread.Join([n])
    End Sub
 
    Private Sub New()
        _thread.IsBackground = True
        _thread.Start()
    End Sub
 
    Private _wi As WorkItem
 
    Private Sub run()
        _wi = getWorkItem()
        While _wi IsNot Nothing
 
            ' "Nachricht schicken"
            _timer.Enabled = True
 
            ' Warte auf "Antwort"
            _received.WaitOne()
 
            ' weiter
            _wi = getWorkItem()
        End While
    End Sub
 
    ' Ersatz für COM Port
    Private WithEvents _timer As New System.Timers.Timer(2000)
 
    Private Sub _timer_Elapsed(ByVal sender As Object, ByVal e As _
      System.Timers.ElapsedEventArgs) Handles _timer.Elapsed
        _timer.Enabled = False
 
        ' "Empfangene Nachricht setzen"
        _wi.InMessage = _wi.OutMessage & " received: " & DateTime.Now.ToString( _
          "HH:mm:ss")
 
        ' Form benachrichtigen
        _wi.Caller.Invoke(_wi.Completed, New Object() {Me, New _
          WorkItemCompletedEventArgs(_wi)})
 
        ' Sags dem Mainthread
        _received.Set()
    End Sub
 
End Class
Public Class Form1
 
    Private Sub Send_Click(ByVal sender As System.Object, ByVal e As _
      System.EventArgs) Handles Send.Click
        Dim wi As New AsyncServer.WorkItem
 
        wi.OutMessage = TextOut.Text & " sent: " & DateTime.Now.ToString( _
          "HH:mm:ss")
        wi.Completed = AddressOf Me.Received
        wi.Caller = Me
        AsyncServer.Server.PostWorkItem(wi)
 
    End Sub
 
    Public Sub Received(ByVal sender As Object, ByVal e As _
      AsyncServer.WorkItemCompletedEventArgs)
        TextIn.Text = e.wi.InMessage
    End Sub
 
    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As _
      System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        AsyncServer.Server.Close()
    End Sub
End Class

Those people who think they know everything are a great annoyance to those of us who do - Isaac Asimov

alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Variable "ByRef" speichern?!1.933MikeJ20.05.08 13:27
Re: Variable "ByRef" speichern?!1.986Melkor20.05.08 13:52
Re: Variable "ByRef" speichern?!1.566MikeJ20.05.08 16:31
Re: Variable "ByRef" speichern?!1.538Melkor21.05.08 18:07
Re: Variable "ByRef" speichern?!1.537MikeJ21.05.08 21:23
Re: Variable "ByRef" speichern?!1.968Melkor22.05.08 11:06
Re: Variable "ByRef" speichern?!1.470MikeJ06.06.08 17:51

Sie sind nicht angemeldet!
Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.

Einloggen  |  Neu registrieren

Funktionen:  Zum Thema  |  GesamtübersichtSuchen 

nach obenzurück
 
   

Copyright ©2000-2024 vb@rchiv Dieter Otter
Alle Rechte vorbehalten.
Microsoft, Windows und Visual Basic sind entweder eingetragene Marken oder Marken der Microsoft Corporation in den USA und/oder anderen Ländern. Weitere auf dieser Homepage aufgeführten Produkt- und Firmennamen können geschützte Marken ihrer jeweiligen Inhaber sein.

Diese Seiten wurden optimiert für eine Bildschirmauflösung von mind. 1280x1024 Pixel