Unterschied zwischen Visual Studio Debugging und freier Wildbahn

  • VB.NET

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Elephant.

    Unterschied zwischen Visual Studio Debugging und freier Wildbahn

    Ich habe in einem eigenen Thread eine Warteschleife, die eine globale Variable abfragt, die in einer anderen Sub gesetzt wird

    VB.NET-Quellcode

    1. Do
    2. 'Warteschleife
    3. Loop Until SchleifeZuEnde

    Wenn ich das im Visual Studio teste funktioniert es, in freier Wildbahn erkennt die Schleife aber nicht das die Variable auf True gesetzt wurde.
    Hört sich so an, also wäre es besser das per Event zu lösen. In einer Schleife auf etwas zu warten ist meist ein Designfehler.

    Der Code ist zudem nicht aussagekräftig genug um dein Problem zu finden. Wo ist der Rest?
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    mrMo schrieb:

    Der Code ist zudem nicht aussagekräftig genug um dein Problem zu finden. Wo ist der Rest?

    Hier mal ein TestProjekt was bis auf den unwichtigen Rest so ist wie das Original und sich auch so verhält.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim PL_Werte(1) As Integer
    3. Dim SchleifeZuEnde As Boolean
    4. Dim XMeinTread As System.Threading.Thread 'Für neuen Thread erzeugen
    5. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    6. PL_Werte(0) = 3
    7. PL_Werte(1) = 5
    8. Label3.Text = "Gestartet"
    9. XMeinTread = New System.Threading.Thread(AddressOf Me.MeinTread)
    10. XMeinTread.IsBackground = True 'Sorgt dafür das der Thread beim beenden des Programms mit geschlossen wird
    11. XMeinTread.Start(PL_Werte) 'Vorgang starten
    12. End Sub
    13. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    14. SchleifeZuEnde = True
    15. End Sub
    16. Private Sub MeinTread(ByVal PL_Werte() As Integer)
    17. Me.Invoke(Sub() Label1.Text = CStr(PL_Werte(0)))
    18. Me.Invoke(Sub() Label2.Text = CStr(PL_Werte(1)))
    19. Do
    20. 'Warteschleife
    21. Loop Until SchleifeZuEnde
    22. Me.Invoke(Sub() Label3.Text = "Gestoppt")
    23. SchleifeZuEnde = False
    24. End Sub
    25. End Class
    Zeile#11 ist Option Strict On inkompatibel. Wer weiß schon, was der Compiler da versucht hinzubiegen und welche Konsequenzen das hat …
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    mrMo schrieb:

    In einer Schleife auf etwas zu warten ist meist ein Designfehler.
    Ein Timer würde sich hier auch gut anbieten.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    @Elephant Option Strict On und dieser Code funktionieren:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim PL_Werte(1) As Integer
    3. Dim SchleifeZuEnde As Boolean
    4. Dim XMeinTread As System.Threading.Thread 'Für neuen Thread erzeugen
    5. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    6. PL_Werte(0) = 3
    7. PL_Werte(1) = 5
    8. Label1.Text = PL_Werte(0).ToString()
    9. Label2.Text = PL_Werte(1).ToString()
    10. Label3.Text = "Gestartet"
    11. XMeinTread = New System.Threading.Thread(AddressOf Me.MeinTread)
    12. XMeinTread.IsBackground = True 'Sorgt dafür das der Thread beim beenden des Programms mit geschlossen wird
    13. XMeinTread.Start() 'Vorgang starten
    14. End Sub
    15. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    16. SchleifeZuEnde = True
    17. End Sub
    18. Private Sub MeinTread()
    19. Do
    20. 'Warteschleife
    21. Loop Until SchleifeZuEnde
    22. Me.Invoke(Sub() Label3.Text = "Gestoppt")
    23. SchleifeZuEnde = False
    24. End Sub
    25. End Class
    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!
    Wie steht's denn damit?

    VB.NET-Quellcode

    1. Friend Class Form1
    2. Dim PL_Werte(1) As Integer
    3. Dim SchleifeZuEnde As Boolean
    4. Dim XMeinTread As System.Threading.Thread 'Für neuen Thread erzeugen
    5. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    6. PL_Werte(0) = 3
    7. PL_Werte(1) = 5
    8. Label3.Text = "Gestartet"
    9. XMeinTread = New System.Threading.Thread(Sub() Me.MeinTread(PL_Werte))
    10. XMeinTread.IsBackground = True 'Sorgt dafür das der Thread beim beenden des Programms mit geschlossen wird
    11. XMeinTread.Start() 'Vorgang starten
    12. End Sub
    13. Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click
    14. SchleifeZuEnde = True
    15. End Sub
    16. Private Sub MeinTread(ByVal PL_Werte() As Integer)
    17. Me.Invoke(Sub() Label1.Text = CStr(PL_Werte(0)))
    18. Me.Invoke(Sub() Label2.Text = CStr(PL_Werte(1)))
    19. Do
    20. 'Warteschleife
    21. Loop Until SchleifeZuEnde
    22. Me.Invoke(Sub() Label3.Text = "Gestoppt")
    23. SchleifeZuEnde = False
    24. End Sub
    25. End Class
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    kleiner Hinweis, weil ich das früher selber so gesagt habe wie Du: es heißt die Syntax, nicht der ;)
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Danke für den Hinweis mit die Syntax

    Der Sourcecode von VaporZed hat immer noch das Problem, dass er in Freier Wildbahn nicht funktioniert.
    Der Sourcecode von RodFromGermany der keine Werte Übergabe hat läuft auch in Freier Wildbahn.

    Selbst wenn ich es anders lösen sollte wüsste ich doch gerne, warum es im Debugger funktioniert, in freier Wildbahn aber nicht.
    Hüh? Mein Code läuft zumindest bei mir auch ohne VS.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Nochmal getestet um sicher zu sein das ich keinen Fehler gemacht habe.

    Bei mir ist es so das ich Button1 klicke Gestartet erscheint.
    Ich klicke Button2, scheinbar passiert nichts, aber wenn ich nochmal Button1 klicke steht da Gestoppt,
    Im Debugger kommt Gestoppt ohne das ich nochmal Button1 klicke.

    Das einzige was mir einfällt wenn es bei Dir geht, das noch ein Fehler im VB2010 steckt der in deinem VB nicht mehr da ist.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Elephant“ ()

    *hust* Der Staub von VB2010 reizt meine Lunge … :P
    Dann wäre es wohl ein Versuch VS 2022 mal zu installieren und es da zu probieren.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Muss ich dann wohl machen.

    Habe ja schonmal von RodFromGermany die Info bekommen das er
    mehrfach zwei Studios auf einem Rechner (10, 13, 17, das 19er war nicht dabei) hatte.
    Wird dann wohl auch mit 22 gehen.

    Habe mit Visual Studio 2010 ein Programm geschrieben, was auch öffentlich heruntergeladen werden kann.
    Ich schreibe zu dem Programm, dass wenn man es an einen Platz benötigt, wo nicht der PC steht (für den Sinn des Programms recht wahrscheinlich) man
    auch ein XP PC vom Flohmarkt nutzen kann.
    Sollte wieder erwarten da doch noch ein Fehler versteckt sein will ich es warten und die neue Version wieder für XP bereitstellen.
    Ein mit VB22 übersetztes Programm wird ja wahrscheinlich nicht mehr unter XP laufen.
    Es geht um die Framework Version, nicht von wann die IDE ist.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Elephant schrieb:

    Bei der Beispiellösung von RodFromGermany werden keine Daten an meinen Thread übergeben.
    Was passiert mit den Daten, die Du an den Thread übergeben hast und ich nicht?
    Warum invokst Du im Thread oben die beiden Label-Texte?
    Macht mein Snippet etwas anderes als es Dein Snippet tun soll?
    Hast Du in Deinem Snippet wesentliche Teile weggelassen, weil Du glaubst, sie seien nicht wichtig?
    Welche Daten müssen tatsächlich an den Thread übergeben werden?
    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!

    RodFromGermany schrieb:

    Was passiert mit den Daten, die Du an den Thread übergeben hast und ich nicht?

    Bei deinem Code passiert das selbe wie bei meinem.
    Nur habe ich für den Sourcecode das ganze restliche Programm weggelassen.
    Im richtigen Programm brauche ich 2 Integer Werte im Thread, nicht ums sie in eimem Label anzuzeigen,
    sondern sie bestimmen auf welche Elemente aus einem Array zugegriffen wird.

    Zu
    Es geht um die Framework Version, nicht von wann die IDE ist. wie mrMO meinte

    Scheinbar spielt beides eine Rolle.
    Ich habe jetzt VB22 und es verhält sich bei mir immer noch so wie beschrieben.
    Aber jetzt schon im Debugging und nicht erst in freier Wildbahn.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Elephant“ ()