Thread lässt Anwendung abstürzen/ VS13-VB12

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von sonne75.

    Thread lässt Anwendung abstürzen/ VS13-VB12

    Hallo Community,

    ich bin recht frisch in der VB Welt und bin dabei mein erstes größeres Projekt umzusetzen.
    Geplant ist eine Anwendung die in einer Drittanwendung Mausklicks und Tastatureingaben ausführt.

    Gestartet wird die Drittanwendung über mein Programm mit:

    Quellcode

    1. startProg = Shell(directoryProg, vbNormalFocus)


    Nach Start soll dann über ein Button (ButtonStart) die "Automatische Steuerung" der Maus und Tastatur gestartet werden.

    Da ich die Pausen zwischen den einzelnen Mausbewegungen und Tastatureingaben mit <Threading.Thread.Sleep( )> ausführe (Gibt es hier nicht
    iwie eine bessere Möglichkeit?) und nicht will das die komplette Anwendung einfriert, habe ich die entsprechende Methode in einem Thread ausgelagert

    Code zum Aufrufen des Threads:

    Quellcode

    1. Public Sub ButtonStart_Click(sender As Object, e As EventArgs) Handles ButtonStart.Click
    2. 'Ein paar If-Abfragen die entsprechend bei False mit einer MSG-Box gehandhabt werden
    3. If (RadioButtonClassB.Checked = True) Then
    4. If (RadioButtonRepOn.Checked = True) Then
    5. If (RadioButtonA.Checked = True) Then
    6. 'In der Klasse BsAsFsRun steht die entsprechende Sub mit dem Code zur Steuerung der Maus und Tastatur im Drittprogramm
    7. Dim run1 As New BsAsFsRun
    8. 'Starte Thread mit der entsprechenden Methode aus der Klasse BsAsFsRun
    9. threadForFarming = New System.Threading.Thread(AddressOf run1.FsRuAcRuRepOn)
    10. threadForFarming.Start()
    11. ...


    Ein Ausschnitt aus der Methode <FsRuAcRuRepOn>

    Quellcode

    1. ...
    2. Threading.Thread.Sleep(5000)
    3. Windows.Forms.Cursor.Position = New Point(OberflaecheGUI.xKoordUmrechner(234, OberflaecheGUI.xAuslesenAufloesung), OberflaecheGUI.yKoordUmrechner(519, OberflaecheGUI.yAuslesenAufloesung))
    4. mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0)
    5. mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0)
    6. Threading.Thread.Sleep((OberflaecheGUI.TextBoxTime.Text * 1000))
    7. SendKeys.Send("k")
    8. ...


    Wenn ich das Drittprogramm aus meiner Anwendung heraus starte, funktioniert noch alles. Sobald ich dann aber den Button
    drücke der den Thread aufruft, positioniert sich die Maus links oben in der Ecke und die Anwendung stürzt ab.

    Ist der Fehler aus den Codeausschnitten schon ersichtlich oder wo könnte ich anfangen zu suchen?
    Wenn ich die Methode ohne Thread aufrufe, funktioniert sie wunderbar. ?(

    Ich hoffe Ihr könnte mir ein bisschen unter die Arme greifen :saint: .

    Vielen Dank schonmal vorab! :)

    Liebe Grüße
    Patrick
    Hallo,

    das einzige, wo mir ins Auge springt, wäre die Codezeile:

    VB.NET-Quellcode

    1. Threading.Thread.Sleep((OberflaecheGUI.TextBoxTime.Text * 1000))

    Weil du kannst keinen String mit einem Integer multiplizieren. Wenn du in der TextBox zehn eingibst, kommt
    eine Fehlermeldung.

    Schreibe bitte ganz oben im Quellcode Option Strict On und dann lasse dir die Fehler vom VS beheben.

    Kommt keine Fehlermeldung, wenn du auf dem Button klickst?

    Freue mich auf Antwort.

    MFG
    Alex-Digital :D
    ~ Alex-Digital :D

    if(!Internet.VBP.Get<User>("Alex-Digital").IsOnline) this.Close(); :D
    @sonne75
    Wenn man nur Daten von Steuerelementen lesen will (wie hier den Text der Textbox) funktioniert das schon. Es kommt nur dann eine Exception wenn man aus einem anderen Thread Werte von anderen Steuerelementen verändern will.

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten

    sonne75 schrieb:

    und was ist damit?
    Macht exakt was es soll, probier es aus:

    VB.NET-Quellcode

    1. Windows.Forms.Cursor.Position = New Point(10, 10)

    @PAL92 Vielleicht probierst Du zunächst eine nicht-Thread-Variante aus, und wenn die funktioniert, lagerst Du den Code in einen Thread aus.
    Ohne Thread lassen sich die Fehler leichter identifizieren.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    sonne75 schrieb:

    aus Parallelthread
    Da er aus 2 Programmen heraus unterschiedlich gesetzt werden kann, denke ich, ist das kein Problem.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich hab das mit dem Cursor sogar überlesen... Aber da du die Textbox angesprochen hast hab ich mich auf das bezogen :)
    Und lesen wie gesagt geht ja ohne Probleme, nur beim Setzen kommt halt eine Exception (Ausser vielleicht wenn man das CheckIllegaldingens auf true oder so setzt)

    lg
    ScheduleLib 0.0.1.0
    Kleine Lib zum Anlaufen von Code zu bestimmten Zeiten
    Vielen Dank für die vielen Antworten!:)

    Mein Fehler war das ich den Code ohne Cast hier rein kopiert habe :whistling: :cursing: ,
    im Programm selbst habe ich natürlich die TextBoxen entsprechen gecastet, also mit CInt und der Option Strict on -> Keine Fehlermeldung :saint:

    Wenn ich die Methode ohne Thread aufrufe funktioniert alles wie es soll, aber das Thread.Sleep() verursacht dann halt einen kompletten freeze, das wollte ich ja verhindern,
    da ich im weiteren Verlauf ein Button zum beenden der Methode einbauen möchte. Solange ich die Thread.Sleep () drin habe, keine Chance die Methode durch Klicken zu beenden :(.
    Oder hat hier jemand eine Idee wie ich das Problem löse, dann bräuchte ich es auch nicht in einen Thread auslagern?

    Ich werde den code mal Schritt für Schritt durchgehen und auslagern, mal schauen ob ich den Fehler finde.

    Aber es kann nicht daran liegen das ich den thread in Klasse x aufrufe und er auf eine Methode der Klasse y verweist?
    Naja falls jemand noch eine Idee hat, als her damit :)

    Vielen Dank! :)

    LG
    Hallo sonne75,

    nein du wurdest nicht ignoriert. :saint:

    Bis zu SendKeys.Send("") kam das Programm ja noch nichtmal, daher habe ich erstmal diesen Fehler gesucht.
    Grad gefunden, anscheinend kann ich keine Methode einer anderen Klasse aufrufen.

    Nun zu SendKeys...gibt es hier eine Möglichkeit die Tastatureingabe in einem Thread auszuführen?

    LG