Hintergrund-Thread blockiert den Rest

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von Nixsager.

    Hintergrund-Thread blockiert den Rest

    Ich habe folgendes Problem:
    Ich habe einen Hintergrund-Thread, aber der blockiert die Ausführung des restlichen Codes.

    Im Modul steht folgendes:

    VB.NET-Quellcode

    1. Dim HintergrundThread As Threading.Thread = New Threading.Thread(AddressOf Hintergrund)


    in einem Sub in dem selbem Modul das ich aufrufe steht folgendes:

    VB.NET-Quellcode

    1. If HintergrundThread.IsAlive = False Then HintergrundThread.Start()


    Und in dem Hintergrund-Sub habe ich eine Do loop-Schleife die den Code immer wieder ausführen soll.
    Das wird auch wie es soll getan, ab das Aufrufen anderer Subs wird blockiert.

    In dem Hintergrund-Sub steht folgendes.

    VB.NET-Quellcode

    1. Private Sub Hintergrund()
    2. HintergrundThread.IsBackground = True
    3. Do
    4. Loop
    5. End Sub

    Etwas ambildern kann ich es nur wenn ich den Thread mitThread.Sleep(50) schlafen legen.
    Aber er soll nicht ja schlafen.
    Sonder im Hintergrund laufen, und den restlichen Code nicht blockert, genauso als würde der Hintergrund-Thread nicht existieren.
    Den Hintergrund-Thrad hatt ich schon komplett rausgenommen, also liegt der Fehler definitiv in zusammenhang mit dem Hintergrund-Thread.

    Wo ist mein Fehler, und wieso werden die Restlichen Subs nicht richtig ausgeführt?
    Bei mir stellt dein Code kein Problem dar. Aber versuche mal, in die Do-Loop-Schleife

    VB.NET-Quellcode

    1. Threading.Thread.Sleep(0)
    zu schreiben. Das lässt den Thread so lange anhalten, wie Windows braucht, um andere Threads zu bearbeiten.
    Das Funktioniert leider nicht.
    Wie schon gesagt, der Thread soll nicht schlafen gelegt werden.

    Zu erwähnen ist, das in der Schleife andere Funktionen aufgerufen werden, die wiederum eine DLL nutzt, ein paar IF und Case-Abfragen und Daten aus eine Array gelesen werden.
    Wenn Du schon willst, dass wir Dir helfen, dann solltest Du JEDEN relevanten Code posten. Irgendwelche Schnipsel helfen da wenig, wenn Du das Wesentliche verschweigst.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o
    Den Code kann ist nicht posten.

    Wie gesagt, die Do Loop-Schleife enzhählt mehrere If- und Case-Abfragen, die externe Subs aufrufen die ein DLL nutzen, und Wert aus einem Array liest, vergleich und in einer temporalen Variabel speichert.

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

    Nixsager schrieb:

    Wie meinst du das?
    Oder beschreib mal verbal, was Dein Programm macht / machen soll.
    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:

    VB-Fragen über PN werden ignoriert!
    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!
    Nagut hiermal (auf Risko) der Code der in dem Hintergrund-Thread läuft.

    VB.NET-Quellcode

    1. Private Sub FreezeCheat()
    2. 'Control.
    3. FreezeCheatThread.IsBackground = True
    4. Dim TempAdressValue As SInt32
    5. Dim TempValue As String
    6. Do
    7. For I As UInt8 = 0 To 128
    8. If CheatList(I).CheatActive = 1 And CheatList(I).CheatType = CheatType.Freeze And ProgramActive = 1 Then
    9. If CheatList(I).CheatPointerAdress <> "" Then
    10. TempAdressValue = DMAtoSMA(ProgramTitle, CheatList(I).CheatAdress, CheatList(I).CheatPointerAdress)
    11. Else
    12. TempAdressValue = CheatList(I).CheatAdress
    13. End If
    14. If CheatList(I).CheatValue <> "" Then
    15. TempValue = CheatList(I).CheatValue
    16. ElseIf CheatList(I).CheatTempValue <> "" Then
    17. TempValue = CheatList(I).CheatTempValue
    18. ElseIf (CheatList(I).CheatValue = "" Or CheatList(I).CheatValue = Nothing) And (CheatList(I).CheatTempValue = "" Or CheatList(I).CheatTempValue = Nothing) Then
    19. Select Case CheatList(I).CheatSize
    20. Case CheatSize.Bin
    21. TempValue = Convert.ToString(MemReadUInt8(ProgramTitle, TempAdressValue))
    22. CheatList(I).CheatTempValue = TempValue
    23. Case CheatSize.UInt8
    24. TempValue = Convert.ToString(MemReadUInt8(ProgramTitle, TempAdressValue))
    25. CheatList(I).CheatTempValue = TempValue
    26. Case CheatSize.SInt8
    27. TempValue = Convert.ToString(MemReadSInt8(ProgramTitle, TempAdressValue))
    28. CheatList(I).CheatTempValue = TempValue
    29. Case CheatSize.UInt16
    30. TempValue = Convert.ToString(MemReadUInt16(ProgramTitle, TempAdressValue))
    31. CheatList(I).CheatTempValue = TempValue
    32. Case CheatSize.SInt16
    33. TempValue = Convert.ToString(MemReadSInt16(ProgramTitle, TempAdressValue))
    34. CheatList(I).CheatTempValue = TempValue
    35. Case CheatSize.UInt32
    36. TempValue = Convert.ToString(MemReadUInt32(ProgramTitle, TempAdressValue))
    37. CheatList(I).CheatTempValue = TempValue
    38. Case CheatSize.SInt32
    39. TempValue = Convert.ToString(MemReadSInt32(ProgramTitle, TempAdressValue))
    40. CheatList(I).CheatTempValue = TempValue
    41. Case CheatSize.Flt32
    42. TempValue = Convert.ToString(MemReadFlt32(ProgramTitle, TempAdressValue), System.Globalization.CultureInfo.InvariantCulture)
    43. CheatList(I).CheatTempValue = TempValue
    44. Case CheatSize.Flt64
    45. TempValue = Convert.ToString(MemReadFlt64(ProgramTitle, TempAdressValue), System.Globalization.CultureInfo.InvariantCulture)
    46. CheatList(I).CheatTempValue = TempValue
    47. End Select
    48. End If
    49. Select Case CheatList(I).CheatSize
    50. Case CheatSize.Bin
    51. MemWriteUInt8(ProgramTitle, TempAdressValue, Convert.ToByte(BinMod(DecToBin(MemReadUInt8(ProgramTitle, TempAdressValue), 8), (TempValue))))
    52. Case CheatSize.UInt8
    53. MemWriteUInt8(ProgramTitle, TempAdressValue, Convert.ToByte((TempValue)))
    54. Case CheatSize.SInt8
    55. MemWriteSInt8(ProgramTitle, TempAdressValue, Convert.ToSByte(TempValue))
    56. Case CheatSize.UInt16
    57. MemWriteUInt16(ProgramTitle, TempAdressValue, Convert.ToUInt16(TempValue))
    58. Case CheatSize.SInt16
    59. MemWriteSInt16(ProgramTitle, TempAdressValue, Convert.ToInt16(TempValue))
    60. Case CheatSize.UInt32
    61. MemWriteUInt32(ProgramTitle, TempAdressValue, Convert.ToUInt32(TempValue))
    62. Case CheatSize.SInt32
    63. MemWriteSInt32(ProgramTitle, TempAdressValue, Convert.ToInt32(TempValue))
    64. Case CheatSize.Flt32
    65. MemWriteFlt32(ProgramTitle, TempAdressValue, Convert.ToSingle(TempValue, System.Globalization.CultureInfo.InvariantCulture))
    66. Case CheatSize.Flt64
    67. MemWriteFlt64(ProgramTitle, TempAdressValue, Convert.ToDouble(TempValue, System.Globalization.CultureInfo.InvariantCulture))
    68. End Select
    69. ElseIf CheatList(I).CheatActive = 0 Then
    70. CheatList(I).CheatStatus = 0
    71. CheatList(I).CheatTempValue = Nothing
    72. End If
    73. Next
    74. Loop
    75. End Sub


    Die Routinen MemReadXXX und MemWriteXXX nutzen eine DLL für den Speicherzugriff.
    Die Routine DMAtoSMA gibt mir die statische Adresse nach der Angabe der Basis-Adresse und der Zeiger zurück.
    Jeder Speicherzugriff findet über über eine DLL statt. Wieso ist egal.

    Die Schleife läuft ohne probleme.
    Nur das abarbeiten von dem aufrufen anderer Routine über das Fenster/Form wird blockiert.

    VB spuckt keine auße vernachlässigbare Warnung nichts aus.
    Wird wie gesagt der Hintergrund-Thread nicht genutzt, läuft alles ohne Probleme.

    @RodFromGermany
    Ic habe dich ja nicht per PN gefagt, sondern hier. ;)
    Es ging ja nur um den Quellcode.

    ErfinderDesRades: Das sieht doch wieder sehr nach überaus fragwürdigen Manipulationen in anneren Programmen aus.
    --> closed

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