Tach Leute!
Ich will euch heute folgendes zeigen: Wie erstelle ich einen Thread für eine Sub, die Parameter aufnimmt - oder auch nicht.
Als als erstes fangen wir einmal mit dem wichtigesten an: Der aufzurufenden Sub:
(Erst einmal OHNE Parameter)
Um jetzt eine Thread für diese Sub zu erstellen, erzeugen wir zuerst eine Instanz eines Threadobjekts:
Dann "schalten" wir den Thread auf Background-Modus(d.h. wenn der Hauptthread beendet wird, der des Forms, dann wird auch der erzeugte Thread abgebrochen):
Anschließend starten wir den Thread:
So das war ja noch der einfache Teil, jetz aber gehts an Eingemachte, denn nun wollen wir einen Thread für eine Sub mit Parameter erstellen. Dazu brauchen wir einen Delegaten: ParameterizedThreadStart:
Und natürlich auch die Sub, die Parameter emfängt:
Dann erzeugen wir ein neues Threadobject, bei dem der Konstruktor den Delegaten empfängt, setzen ihn wieder in den Hintergrund und starten ihn mit Argumenten:
Erklärungen:
1.) Für den parametrisierten Start eines Threads, kann bei Option Strict On, keine einfaches
=>Das hat 2 Konsequenzen:
a.)Muss eben ein Delegat verwendet werden, der eine ensprechende Signatur hat(ParameterizedThreadStart(obj As Object))
b.)Man kann auch den unparametrisierten Start mithilfe eines Delegaten, der zur Signatur von DoSomething() passt, verwenden:
c.)Wenn ein Thread für eine Sub mit mehrern Argumenten erstellt wird, hat man 2 Optionen das ganze zu lösen: ENTWEDER man packt zuerst die Argumente zu einem Object-Array zusammen, übergibt sie und "entpackt" sie dann in der Sub ODER man verwendet den Delegaten Action, der bis zu 16 Parameter verwenden kann(Beispiel von @ErfinderDesRades)
Zusammengefasst:
Ich hoffe ich konnte einigen helfen!
Mfg Euer Radinator
EDIT: Danke and Euch!
Ich will euch heute folgendes zeigen: Wie erstelle ich einen Thread für eine Sub, die Parameter aufnimmt - oder auch nicht.
Als als erstes fangen wir einmal mit dem wichtigesten an: Der aufzurufenden Sub:
(Erst einmal OHNE Parameter)
Um jetzt eine Thread für diese Sub zu erstellen, erzeugen wir zuerst eine Instanz eines Threadobjekts:
Dann "schalten" wir den Thread auf Background-Modus(d.h. wenn der Hauptthread beendet wird, der des Forms, dann wird auch der erzeugte Thread abgebrochen):
Anschließend starten wir den Thread:
So das war ja noch der einfache Teil, jetz aber gehts an Eingemachte, denn nun wollen wir einen Thread für eine Sub mit Parameter erstellen. Dazu brauchen wir einen Delegaten: ParameterizedThreadStart:
Und natürlich auch die Sub, die Parameter emfängt:
Dann erzeugen wir ein neues Threadobject, bei dem der Konstruktor den Delegaten empfängt, setzen ihn wieder in den Hintergrund und starten ihn mit Argumenten:
Erklärungen:
1.) Für den parametrisierten Start eines Threads, kann bei Option Strict On, keine einfaches
New Thread(AddressOf DoSomething2()
gemacht werden, denn die Signatur des Delegaten ThreadStart() stimmt nicht mit DoSomething(obj As Object) übereinstimmt.=>Das hat 2 Konsequenzen:
a.)Muss eben ein Delegat verwendet werden, der eine ensprechende Signatur hat(ParameterizedThreadStart(obj As Object))
b.)Man kann auch den unparametrisierten Start mithilfe eines Delegaten, der zur Signatur von DoSomething() passt, verwenden:
c.)Wenn ein Thread für eine Sub mit mehrern Argumenten erstellt wird, hat man 2 Optionen das ganze zu lösen: ENTWEDER man packt zuerst die Argumente zu einem Object-Array zusammen, übergibt sie und "entpackt" sie dann in der Sub ODER man verwendet den Delegaten Action, der bis zu 16 Parameter verwenden kann(Beispiel von @ErfinderDesRades)
Zusammengefasst:
VB.NET-Quellcode
- Public Sub DoSomething1()
- End Sub
- Public Sub DoSomething2(obj As Object)
- End Sub
- Sub GenerateThread()
- Dim thread1 As New Thread(AddressOf DoSomething1)
- thread1.IsBackground = True
- thread1.Start()
- Dim pts2 As New ParameterizedThreadStart(AddressOf DoSomething2)
- Dim thread2 As New Thread(pts2)
- thread2.IsBackground = True
- thread2.Start(New Object)
- 'Alternativ den Parameterlosen Thread mit Delegaten:
- Dim ts3 As New ThreadStart(AddressOf DoSomething1)
- Dim thread3 As New Thread(ts3)
- thread3.IsBackground = True
- thread3.Start()
- End Sub
C#-Quellcode
- public void GenerateThread()
- {
- Thread thread1 = new Thread(DoSomething1);
- thread1.IsBackground = true;
- thread1.Start();
- ParameterizedThreadStart pts = new ParameterizedThreadStart(DoSomething2)
- Thread thread2 = new Thread(pts);
- thread2.IsBackground = true;
- thread2.Start(new object);
- //Alternativ den Parameterlosen Thread mit Delegaten:
- ThreadStart ts = new ThreadStart(DoSomething1);
- Thread thread3 = new Thread(ts);
- thread3.IsBackground = true;
- thread3.Start();
- }
- private void DoSomething2(object time)
- {
- }
- private void DoSomething1()
- {
- }
Ich hoffe ich konnte einigen helfen!
Mfg Euer Radinator
EDIT: Danke and Euch!
In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell
Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Radinator“ ()