vb@rchiv
VB Classic
VB.NET
ADO.NET
VBA
C#
Blitzschnelles Erstellen von grafischen Diagrammen!  
 vb@rchiv Quick-Search: Suche startenErweiterte Suche starten   Impressum  | Datenschutz  | vb@rchiv CD Vol.6  | Shop Copyright ©2000-2025
 
zurück

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

VB.NET - Fortgeschrittene
Re: Event auslösen 
Autor: ModeratorDaveS (Moderator)
Datum: 08.07.04 12:27

Meine Meinung auch, aber hier ist eine Lösung mit "Arbeiterklasse", Threads und Events.

Die Klasse SomeClass tut irgendetwas in der Routine DoSomething(). Diese Routine wird in einem zweiten Thread mittels asynch Delegate aufgerufen (das hatten wir ja schon). Die Klasse selbst weiss nichts von etwa ProgressBars, meldet aber ihren Fortschritt mit dem ProgressEvent. Dieses Event nimmt ein Objekt von Klasse SomeClassProgressEventArgs als zweiten Parameter . In diesem Objekt ist ein Wert für Fortschritt von 1-100 und eine boolische Variable um die DoSomething() Routine abzubrechen.

Die Hauptklasse (Form1) legt eine Instanz von SomeClass an und started .DoSomething() und hat ein asynchronous CallBack DoSomethingFinished((), was vom Framework aufgerufen wird wenn das Workerthread beendet wird. Ausserdem wird das ProgressEvent abgefangen um ProgressBar1 zu setzen, und eventuell die Arbeit abzubrechen.

So braucht man immerhin keine DoEvents() mehr.

Public Class Form1
    Inherits System.Windows.Forms.Form
 
#Region " Windows Form Designer generated code "
 
    Private _stop As Boolean = False
    Private WithEvents someClass1 As SomeClass
 
    Private Delegate Sub DoSomething()
    Private Delegate Sub SetProgress(ByVal percentDone As Integer)
 
    Private iar As IAsyncResult
 
    Private Sub StartButton_Click(ByVal sender As System.Object, ByVal e As _
      System.EventArgs) Handles StartButton.Click
        If iar Is Nothing Then
            Label1.Text = "Running"
            StartButton.Capture = False
            StartButton.Enabled = False
            someClass1 = New SomeClass("some parameter")
            Dim ds As New DoSomething(AddressOf someClass1.DoSomething)
            iar = ds.BeginInvoke(New AsyncCallback(AddressOf _
              DoSomethingFinished), someClass1)
        Else
            MsgBox("Function is running")
        End If
    End Sub
 
    Private Sub StopButton_Click(ByVal sender As System.Object, ByVal e As _
      System.EventArgs) Handles StopButton.Click
        _stop = True
    End Sub
 
    Private Sub DoSomethingFinished(ByVal iar As IAsyncResult)
        Dim sc As SomeClass = CType(iar.AsyncState, SomeClass)
        MsgBox(sc.ToString + " finished execution")
        StartButton.Enabled = True
        init()
    End Sub
 
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As _
      System.EventArgs) Handles MyBase.Load
        init()
    End Sub
 
    Private Sub init()
        iar = Nothing
        ProgressBar1.Minimum = 1
        ProgressBar1.Maximum = 100
        ProgressBar1.Value = 1
        _stop = False
        Label1.Text = "Stopped"
    End Sub
 
    Private Sub someClass1_ProgressEvent(ByVal sender As Object, ByVal e As _
      SomeClassProgressEventArgs) Handles someClass1.ProgressEvent
        If Me.InvokeRequired Then
            Me.Invoke(CType(AddressOf setProgressBar, SetProgress), New Object( _
              ) {e.percentDone})
        Else
            setProgressBar(e.percentDone)
        End If
        e.Continue = Not _stop
    End Sub
 
    Private Sub setProgressBar(ByVal percentDone As Integer)
        ProgressBar1.Value = percentDone
    End Sub
End Class
 
Public Class SomeClassProgressEventArgs
    Inherits System.EventArgs
    Public Continue As Boolean
    Public percentDone As Integer
    Public Sub New(ByVal continue As Boolean, ByVal percentDone As Integer)
        Me.Continue = continue
        Me.percentDone = percentDone
    End Sub
End Class
 
Public Class SomeClass
    Public Event ProgressEvent(ByVal sender As Object, ByVal e As _
      SomeClassProgressEventArgs)
 
    Private someParameter As String
 
    Public Sub New(ByVal someParameter As String)
        Me.someParameter = someParameter
    End Sub
 
    Public Sub DoSomething()
        Dim continue As Boolean = True
        Dim percentDone As Integer = 1
        While continue AndAlso percentDone < 100
            Dim evArgs As New SomeClassProgressEventArgs(True, percentDone)
            RaiseEvent ProgressEvent(Me, evArgs)
            continue = evArgs.Continue
            If continue Then
                ' Tue was immer...
                percentDone += 1
                System.Threading.Thread.Sleep(100)
            End If
        End While
    End Sub
 
    Public Overrides Function ToString() As String
        Return "SomeClass for: " + someParameter
    End Function
End Class
alle Nachrichten anzeigenGesamtübersicht  |  Zum Thema  |  Suchen

 ThemaViews  AutorDatum
Event auslösen1.020norbert5507.07.04 13:42
Re: Event auslösen756ModeratorDaveS07.07.04 14:22
Re: Event auslösen674norbert5507.07.04 15:15
Re: Event auslösen705spike2407.07.04 16:38
Re: Event auslösen725norbert5507.07.04 17:22
Re: Event auslösen754spike2408.07.04 09:38
Re: Event auslösen729Moderatorralf_oop07.07.04 17:16
Re: Event auslösen734norbert5507.07.04 20:46
Re: Event auslösen969ModeratorDaveS07.07.04 21:55
Re: Event auslösen657spike2408.07.04 09:41
Re: Event auslösen717norbert5508.07.04 11:05
Re: Event auslösen694WaldiMaywood08.07.04 11:12
Re: Event auslösen718norbert5508.07.04 11:26
Re: Event auslösen802WaldiMaywood08.07.04 11:47
Re: Event auslösen732norbert5508.07.04 12:08
Re: Event auslösen727WaldiMaywood08.07.04 12:26
Re: Event auslösen720norbert5508.07.04 17:09
Re: Event auslösen817norbert5508.07.04 17:11
Re: Event auslösen1.119ModeratorDaveS08.07.04 12:27
Re: Event auslösen669norbert5508.07.04 12:33

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-2025 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