|
| |

VB.NET - Fortgeschrittene| Re: Event auslösen | |  | Autor: DaveS (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 |  |
 | 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 |
  |
|
Neu! sevCommand 4.0 
Professionelle Schaltflächen im modernen Design!
Mit nur wenigen Mausklicks statten auch Sie Ihre Anwendungen ab sofort mit grafischen Schaltflächen im modernen Look & Feel aus (WinXP, Office, Vista oder auch Windows 8), inkl. große Symbolbibliothek. Weitere InfosTipp des Monats TOP Entwickler-Paket 
TOP-Preis!!
Mit der Developer CD erhalten Sie insgesamt 24 Entwickler- komponenten und Windows-DLLs. Die Einzelkomponenten haben einen Gesamtwert von 1866.50 EUR...
Jetzt nur 979,00 EURWeitere Infos
|
| |
|
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
|
|