Multithreading

dobPh

Mitglied
Hallo,

Ich habe ein kleines Problem und zwar möchte ich, dass während einer Active Directory Abfrage eine kleine Form aufpoppt, mit der Aufschrifft "bitte warten...". Außerdem soll während der Abfrage der Button, der die Abfrage anstößt, deaktiviert werden um weitere Klicks zu verhindern. Das Problem ist, das bei der Abfrage, sehr viele Datensätze geholt werden und es je nach Netzauslastung schon mal einige Sekunden dauern kann, bis das Ergebnis erscheint. Nach einiger Suche bin ich nun darauf gekommen mit threads zu arbeiten, wobei der eine die Abfrage macht und der andere die Form zeigt.
Bis jetzt habe ich noch nicht mit threads gearbeitet, gibt es dafür ein kleines Codeschnippsel oder Tutorial? Ich habe leider keines gefunden.
Ist das Ganze vielleicht ohne Threads realisierbar?

Danke für eure Mühen
Philipp

edit: die Button Geschichte habe ich eben selbst gelöst ;). Einfach direkt nach klick enabled = false und am Ende der Funktion wieder auf true gesetzt
 
Zuletzt bearbeitet:
Ich habe als Übergangslösung ein kleines gif auf meine Form eingebunden, dass während Abfrage sichtbar wird. Das Problem ist jetzt, dass die Abfrage den Prozessor zu 100% auslastet und sich das gif am Anfang kurz dreht und dann nur noch ab und and abgehackt. Kann man die Prozessorlast irgendwie regeln?

Grüße
Philipp
 
Moin!

Du kommst nicht drum herrum mit Threads zu arbeiten. Der MainThread in dem die Anwendung lauft,
muss sich immer um die Anwendung selber kümmern. Alle weiteren Tasks einer Anwendung,
haben in eingen Threads abzulaufen und ihren Status via Events an den MainThread zu berichten.
Somit steht dem User während eines Tasks die Anwendung iimmer noch zu Verfügung.
Sie kann ihm nur auf diese Weise weiterhin den Status ausgeben und ihm sogar die Gelegenheit bieten,
den den aktuellen Task anzuhalten oder zu stoppen.

In den folgenden Links findest alles was Du für den Anfang brauchst.
[thread=210935]Thread Hilfe, wie beenden? - Thread[/thread]
[post=1337449]AW: Probleme beim neuzeichnen von pictureBox - Post[/post] (Beispielprogramm)

Ich werde dazu in kürze noch ein Tutorial verfassen.
 
Hi,

Es muss (es soll) ja während der AD Abfrage nicht auf das Programm zugegriffen werden, um erneute Button Klicks zu verhindern.
Ich werde mir aber trotzdem die Beispiele mal angucken und mich in das Thema reinlesen.

Danke erstmal
Philipp

Edit:// hast du auch ein Beispiel für VB.NET? oder kann man das analog zu C# umsetzen?
 
Zuletzt bearbeitet:
Es muss (es soll) ja während der AD Abfrage nicht auf das Programm zugegriffen werden, um erneute Button Klicks zu verhindern.
Dann deaktivier die Controls einfach.
C#:
Control.Enabled = false;

hast du auch ein Beispiel für VB.NET? oder kann man das analog zu C# umsetzen?
Schau Dir das entweder mit dem Reflector for .NET oder mit #Develop (SharpDevelop) an.
Aber beides zu beherrschen ist nicht verkehrt.
Btw ich mag VB ned so. Man sieht vor lauter Buchstaben, gar keinen Quellcode mehr. :rolleyes:
 
Hi Christian,

Dann deaktivier die Controls einfach.
C#:
Control.Enabled = false;
Das habe ich schon raugefunden, siehe mein erster Beitrag der edit. ;)

Mit geht es jetzt darum, dass die Abfrage den Prozess voll auslastet und dann das popup (eine form mit einem gif) nicht richtig dargestellt wird. Deshalb die Frage, ob man von vorn herein schon bestimmen kann, wieviel Prozent der Prozessorlast für die Abfrage verwendet wird damit noch was für den Rest übrigbleibt.

Schau Dir das entweder mit dem Reflector for .NET oder mit #Develop (SharpDevelop) an.

Ok, danke werde ich machen.

Btw ich mag VB ned so. Man sieht vor lauter Buchstaben, gar keinen Quellcode mehr. :rolleyes:
Ich habe vorher nur mit VBA gearbeitet und bin jetzt dabei kleinere Standalone Applikationen zu schreiben. Da viel der Einstieg mit VB.NET relativ einfach, da vieles parallel zu VBA passiert. Aber die Frage nach der Programmiersprache ist ja sowieso fast wie die Fragen nach dem Glauben. ;)

Grüße
Philipp
 
Mit geht es jetzt darum, dass die Abfrage den Prozess voll auslastet und dann das popup (eine form mit einem gif) nicht richtig dargestellt wird. Deshalb die Frage, ob man von vorn herein schon bestimmen kann, wieviel Prozent der Prozessorlast für die Abfrage verwendet wird damit noch was für den Rest übrigbleibt
Wenn Du keinen Thread verwendest, ist das logisch.
Die gesamte Prozessorleistung geht für den aktuellen Prozess drauf.
Das Form bekommt kein Stückchen davon ab um sich selber neu zeichnen zu können.

Wenn Du aber einen Thread verwendest, kann sich das Form in der Zwischenzeit selber neu zeichnen.
Und Du kannst zusätzlich auch noch die Prorität des WorkerThreads einstellen (Thread.Priority).

Schau Dir auch mal das Thread.IsBackground Property an.
Damit gehst sicher, dass der WorkerThread beendet wird, wenn der MainThread terminiert wird. ;)
Andernfalls, solltest in deiner WorkerThreadKlasse das IDisposable Interface implementieren
und darin dann den WorkerThread terminieren.
 
Zuletzt bearbeitet:
Ah ok. Ich dachte das bei der Aufteilung in Threads nicht auch die Prozessorlast aufgeteilt werden kann.
Also dann werd mich erstmal belesen und dann anfangen die Geschichte in Threads aufzuteilen.

Danke bis hierhin erstmal,
Philipp
 
Hallo nocheinmal,

ich habe jetzt ein bißchen rumprobiert und komme nicht weiter.
Ich habe das Zeigen der kleinen popUp Form während der AD-Abfrage nun in eignen Thread gepackt, jedenfalls glaube ich das getan zu haben ;).
Das Problem ist, dass das kleine Form sich trotzdem nur halb aufbaut oder gleich wieder verschwindet, weil die Abfrage die ganze cpu Last in Anspruch nimmt.

Nachfolgend mein Code:
Code:
Private Sub ListBox1_SelectedIndexChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ListBox1.SelectedIndexChanged
        Dim auswahl As String
        Dim myThread As Thread = New Thread(New ThreadStart(AddressOf show_splash))

        'gewählte Gruppen in auswahl speichern, um Filter zusammenzusetzen
        auswahl = ListBox1.SelectedItem

        'PopUp Thread starten
        myThread.Start()

        'Funktion getUsers starten und die Listbox auswahl als Parameter übergeben
        'Hier passiert die AD-Abfrage
        getUsers(auswahl)

        'PopUp Thread stoppen
        myThread.Abort()

    End Sub

Code:
Private Sub show_splash()
        splash.Show()
    End Sub

Woran kann das liegen? Muss ich die AD-Abfrage in ein eigenen Thread packen? Das habe ich schon versucht, aber dann bekomme ich die Fehlermeldung, dass ich einen Zugriff auf einen anderen Thread mache, weil ich bei der AD-Abfrage die Ergebnisse gleich in ein datagrid schreibe.

Danke für Hilfe
Philipp
 
Eine andere wichtige Frage wäre zu klären, bevor du mit verschiedenen Threads hantierst: Dauert die Abfrage so lange, oder das Verarbeiten der Daten danach, sprich das Auslesen des Resultsets?
 

Neue Beiträge

Zurück