ProgressBar soll trotz u.WaitForExit laufen

  • VB.NET

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

    ProgressBar soll trotz u.WaitForExit laufen

    Hallo Leute ich hab da mal wieder ein kleines Problem.

    momentan schaut das ganze so bei mir aus.

    VB.NET-Quellcode

    1. If ProgressBar1.Value = ProgressBar1.Maximum Then
    2. ProgressBar1.Value = 0
    3. Else
    4. ProgressBar1.Value = ProgressBar1.Value + 1
    5. End If
    6. Shell(GNLogger)
    7. Shell(GNLogger)
    8. u1.StartInfo.FileName = Batchup
    9. u1.StartInfo.CreateNoWindow = True
    10. u1.StartInfo.UseShellExecute = False
    11. u1.StartInfo.RedirectStandardOutput = True
    12. u1.Start()
    13. u1.WaitForExit()Shell("Taskkill /F /IM GNLOGGER.EXE /T", , True, -1)
    14. CopyTraces()


    das dumme ist nur das mir der ProgressBar dauernt bei dem u.wait anhält und erst weiter geht wenn es zu ist. Der Progressbar soll aber für mich da sein damit ich weis ob das Program noch etwas tut oder nicht (aufgehängt).

    KDavid81 schrieb:

    das dumme ist nur das mir der ProgressBar dauernt bei dem u.wait anhält und erst weiter geht wenn es zu ist

    Weil du genau das programmiert hast?^^

    Schau dir mal Multithreading an.
    Ausserdem zeig mal den kompletten Code, mit den Events in denen sich der Code befindet.

    Mfg Dancger
    MESS WITH THE BEST, DIE LIKE THE REST! :evil:
    n'paar Links: DNS Tools, Steal WA DB, Droidsheep...

    KDavid81 schrieb:

    momentan schaut das ganze so bei mir aus.

    Das sieht mir so aus als hättest Du wahllos irgendwelchen Code zusammenkopiert.

    Warum
    - mixt Du Shell (=veraltet) mit Process
    - leitest Du den Standardoutput um, benutzt Du das Feature überhaupt
    - Paste Fehler ? u1.WaitForExit()Shell("Taskkill /F /IM GNLOGGER.EXE /T", , True, -1)
    - beendest einen Process per Console

    Du kannst einen Process ganz einfach mit CloseMainWindow oder Kill beenden, schau Dir mal die Methoden an Process-Methoden
    so also nur mal der Teil der wichtig ist da der rest ja nur zu fragen führt die mir nicht weiter helfen.

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. u.StartInfo.FileName = Batchup
    3. u.StartInfo.CreateNoWindow = True
    4. u.StartInfo.UseShellExecute = False
    5. u.StartInfo.RedirectStandardOutput = True
    6. u.Start()
    7. Timer1_Tick()
    8. End Sub

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick()
    2. Do While u.HasExited = False
    3. Timer1.Interval = 200
    4. If ProgressBar1.Value = ProgressBar1.Maximum Then
    5. ProgressBar1.Value = 0
    6. Else
    7. ProgressBar1.Value = ProgressBar1.Value + 1
    8. End If
    9. LoopEnd Sub

    ich starte über das u.start ein batch feil auf dessen ende ich warten muss damit ich mit dem program weiter machen kann.
    hab zwischen drinn mal ein paar sachen versucht daher sa das vorher auch so zusammen geflieckt aus. mittlerweile hab ich den progressbar am laufen schaut zwar nciht so toll aus aber erfüllt seinen zweck.
    nachteil ist das mir die cpu last hoch auf 60% geht. kann man das irwi schöner machen?

    KDavid81 schrieb:

    da der rest ja nur zu fragen führt die mir nicht weiter helfen.

    Sind wir hier Deine willigen Code-Bots, bei denen Du entscheidest was Du an Informationsbröckchen lieferst ?

    Sobald Du nicht mehr zu faul bist Antworten zu liefern und Dich um Recht-/Gross-/Kleinschreibung sowie Grammatik bemühst, darfst Du Dich gerne wieder melden.

    Kangaroo schrieb:

    Zitat von »KDavid81« da der rest ja nur zu fragen führt die mir nicht weiter helfen.
    Sind wir hier Deine willigen Code-Bots, bei denen Du entscheidest was Du an Informationsbröckchen lieferst ?

    Also eigentlich Trift weder das eine noch das andre zu. Ich wollte niemanden haben der für mir einen ganzen Code zusammen schreibt, nur ein wenig Hilfe. Mal abgesehen davon hab ich vorher nur zu viel mit rein Kopiert und habe bei zweiten Anlauf nur die teile rein Kopiert wo ich die Probleme habe um weiter Missverständnisse zu vermeiden.

    Kangaroo schrieb:

    Sobald Du nicht mehr zu faul bist Antworten zu liefern und Dich um Recht-/Gross-/Kleinschreibung sowie Grammatik bemühst, darfst Du Dich gerne wieder melden.



    Aber beleidigend zu werden ist ok oder wie verstehe ich das?

    Ich entschuldige mich gerne für meine Fehler und auch für meine schlechte Grammatik. Aber ein wenig höflicher könnte man da ja doch auch sein oder etwa nicht?

    Hab einfach nur das Problem das im ersten Fall der ProgressBar beim u.WaitForExit hängen bleibt.

    Im zweiten Fall habe ich dann das Problem das zwar der ProgresBar läuft, aber mir die CPU last hochhält.

    PS: Bin absoluter Anfänger und würd mich über etwas Unterstützung freuen.

    KDavid81 schrieb:

    ber beleidigend zu werden ist ok oder wie verstehe ich das?

    War das beleidigend ? Wenn ich mich mit Deinem Code auseinandersetze und Fragen stelle, jedoch implizit die Antwort bekomme das ginge mich nichts an, so geht mir die Hutschnur hoch. Das gleiche gilt für die Mühe die sich jemand macht sein Problem zu beschreiben: warum soll ich länger Zeit verbrauchen eine Antwort zu schreiben, als Du Deine Frage zu stellen ?

    Zu Deinem Problem:
    - warum überhaupt ein Batch File, Du kannst zu 99% im .NET umfeld bleiben
    - warum das RedirectOutput

    Deine CPU läuft heiss weil Du mit Deinem Timer alle 200ms unnötige Abfragen startest. Eine bessere Lösung würde so aussehen:
    - Dein Batch File in einem Thread per Process.Start beginnen
    - mit WaitForExit bis ende Verarbeitung blocken
    - beim Ende Event auslösen
    - Deine Hauptanwendung macht im Eventhandler mit dem weiter was es noch zu machen hat
    - benutze für Dein Progressbar den Marquee-Style um Tätigkeit zu signalisieren
    Ich musste es über ein Batch machen da ich ansonsten keinen Anhaltspunkt habe um auf das Ende zu warten. Das Program darf erst nach dem Ende der Batch weiter laufen. Daher ja jetzt auch der Versuch mit dem Do While. Der mittlerweile einen Timer bekommen hat aber immer noch auf 50% hängt.
    Das was du mir grade geschrieben hast hört sich so an das, dass Batch startet und das Program dann weiter läuft oder?

    VB.NET-Quellcode

    1. Private Sub Timer1_Tick()
    2. ProgressBar1.Minimum = 0
    3. ProgressBar1.Maximum = 200000
    4. ProgressBar1.Increment(1)
    5. Do While u.HasExited = False
    6. If ProgressBar1.Value = ProgressBar1.Maximum Then
    7. ProgressBar1.Value = 0
    8. Else
    9. ProgressBar1.Value = ProgressBar1.Value + 1
    10. End If
    11. Loop
    12. End Sub

    KDavid81 schrieb:

    Das Program darf erst nach dem Ende der Batch weiter laufen

    Wie definierst Du Pogramm ?

    Wenn Du Deine Forms-Anwendung startest, so generierst Du erst einmal 1 Prozess mit genau 1 Thread, in dem erstmal sämtlicher Code abläuft (klicken, Fenster ziehen, Event Logik). Diesen nennen wir mal GUI-Thread. Wenn Du diesen durch irgendetwas blockst ( WaitForExit), so laufen auch die anderen Events nicht mehr.

    Deshalb lagert man zeitaufwendige Tätigkeiten in einen neuen, separaten Thread aus, um GUI-Updates nicht zu behindern. In Deinem Fall würde sich z.B. ein Backgroundworker anbieten.

    Dein Timer mit seiner Abfrage hasExited blockt zwar nicht, generiert durch seine häufigen Abfragen aber viel CPU Last. Auch die Progressbar brauchst Du nicht selber zu incrementieren, das macht der Marquee-Style von sich aus.

    KDavid81 schrieb:

    ch musste es über ein Batch machen da ich ansonsten keinen Anhaltspunkt habe um auf das Ende zu warten

    Du hast genausoviel, wenn nicht sogar mehr, Kontrolle wenn Du im .NET Code bleibst. Auch hier lagerst Du den Code in einen Thread / BGW aus und signalisiert das Ende durch ein Event .

    Übrigens tust Du Dich um vieles leichter, wenn Du von VB2005 auf VS2010 gehst, gerade das Umgehen mit Threads ist hier viel einfacher.

    VB.NET-Quellcode

    1. Imports Microsoft.Win32
    2. Imports Ediabas
    3. Public Class Form2
    4. Dim DB_up As String
    5. Dim DB_down As String
    6. Dim TestName As String
    7. Dim FolderPath As String
    8. Dim FolderName As String
    9. Dim TestPath As String
    10. Dim Batchup As String
    11. Dim Batchdown As String
    12. Dim j As Integer
    13. Dim RunFolder As String
    14. Dim GNLogger As String
    15. Private u As New Process()
    16. Private u1 As New Process()
    17. Private Sub Form2_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    18. Dim Test_Path As String = Form1.SWBox.Text & "\" & Form1.DB_VARIBox.Text & "\" & Form1.LOCALBox.Text & "\"
    19. Test_PathBox.Text = Test_Path
    20. Dim HDD_Server As String = Form3.TextBox7.Text
    21. HDD_Update_ServerBox.Text = "HDD_UPDATE_SERVER_URL = " & HDD_Server
    22. Dim DatenBank1 As String = Form1.TextBox8.Text
    23. DatenBankBox1.Text = DatenBank1
    24. Dim DatenBank2 As String = Form1.TextBox19.Text
    25. DatenBankBox2.Text = DatenBank2
    26. 'Creating the Test Folder for Update
    27. If Form1.CheckBox2.Checked = False Then
    28. DB_up = Form1.TextBox8.Text
    29. FolderPath = Form3.TextBox14.Text & "\HDDUPDATE\"
    30. FolderName = Date.Now.ToString("yyyyMMdd_HH.mm.ss_" & DB_up)
    31. TestPath = FolderPath & Test_Path & FolderName
    32. End If
    33. 'Creting the Test Folder vor Update and Downgrade
    34. If Form1.CheckBox2.Checked = True Then
    35. Dim nav_gn As String = Form1.TextBox9.Text & "_"
    36. DB_up = Form1.TextBox12.Text
    37. DB_down = Form1.TextBox24.Text
    38. FolderPath = Form3.TextBox14.Text & "\HDDUPDATE\"
    39. FolderName = Date.Now.ToString("yyyyMMdd_HH.mm.ss_" & nav_gn & DB_up & "-" & DB_down)
    40. TestPath = FolderPath & Test_Path & FolderName
    41. End If
    42. TextBox2.Text = 1
    43. Dim Test_Name As String = FolderName
    44. Test_NameBox.Text = Test_Name
    45. Me.Focus()
    46. End Sub
    47. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    48. Application.DoEvents()
    49. Me.TextBox1.Text = ""
    50. Me.TextBox1.Refresh()
    51. 'Check if NAVDB exists
    52. If CheckBox1.Checked = True Then
    53. Dim navd As String = "NAVD"
    54. If Form1.TextBox9.Text = navd Then
    55. Dim nav_map_akt As String = "Kunden Navigation Karte vorhanden und aktiviert" 'if this Text appeares then erase Navi Map
    56. Dim nav_map_dea As String = "Kunden Navigation Karte deaktiviert" 'if this Text appeares then erase Navi Map
    57. Dim result_txt As String = ""
    58. If API.apiInit Then
    59. API.apiJob("NBT", "steuern_routine", "ARG;NAVI_MAP;RRR", "")
    60. API.apiResultText(result_txt, "STAT_NAVI_MAP_TEXT", 1, "T")
    61. If ((result_txt = nav_map_akt) Or (result_txt = nav_map_dea)) Then
    62. API.apiJob("buegl", "wait", "10000", "")
    63. API.apiJob("NBT", "steuern_routine", "ARG;NAVI_MAP;STR;Lösche Kunden Navigation Karte", "")
    64. API.apiJob("buegl", "wait", "120000", "")
    65. API.apiJob("NBT", "steuergeraete_reset", "", "")
    66. API.apiJob("buegl", "wait", "50000", "")
    67. API.apiJob("NBT", "steuern_routine", "ARG;NAVI_MAP;RRR", "")
    68. API.apiResultText(result_txt, "STAT_NAVI_MAP_TEXT", 1, "T")
    69. If ((result_txt = nav_map_akt) Or (result_txt = nav_map_dea)) Then
    70. API.apiJob("buegl", "wait", "10000", "")
    71. API.apiJob("NBT", "steuern_routine", "ARG;NAVI_MAP;STR;Lösche Kunden Navigation Karte", "")
    72. End If
    73. End If
    74. API.apiEnd()
    75. End If
    76. APIVB.closeServer()
    77. End If
    78. End If
    79. 'Creating of the RUN Folders
    80. For j = 1 To TextBox2.Text
    81. RunFolder = TestPath & "\run_" & Format(j, "00") & "\"
    82. ' Create an instance of StreamWriter to write text to a file.
    83. If System.IO.Directory.Exists(RunFolder) = False Then
    84. System.IO.Directory.CreateDirectory(RunFolder)
    85. Else : System.IO.Directory.CreateDirectory(RunFolder)
    86. End If
    87. 'Creating of the Update Batch
    88. Dim talexecution = "\E-Sys.bat -talexecution """
    89. Dim esysconfig_up = "\esysconfig\HDD_Update.txt"""
    90. Dim esysconfig_down = "\esysconfig\HDD_Downgrade.txt"""
    91. Dim Updatepath = "\esysconfig\"
    92. 'Creating of the Update Batch
    93. If Form1.CheckBox2.Checked = False Then
    94. Batchup = Form3.TextBox2.Text & Updatepath & "HDD_Update.bat"
    95. ' Create an instance of StreamWriter to write text to a file.
    96. Using sw As IO.StreamWriter = New IO.StreamWriter(Batchup)
    97. ' Add some text to the file.
    98. sw.Write(Form3.TextBox1.Text & talexecution & Form3.TextBox2.Text & esysconfig_up & " > " & RunFolder & "TAL_" & Format(j, "00") & ".txt")
    99. sw.WriteLine()
    100. sw.Write("more")
    101. sw.Close()
    102. End Using
    103. Else
    104. 'Creating the Update and Downgrade Batch
    105. Batchup = Form3.TextBox2.Text & Updatepath & "HDD_Update.bat"
    106. ' Create an instance of StreamWriter to write text to a file.
    107. Using sw As IO.StreamWriter = New IO.StreamWriter(Batchup)
    108. ' Add some text to the file.
    109. sw.Write(Form3.TextBox1.Text & talexecution & Form3.TextBox2.Text & esysconfig_up & " > " & RunFolder & "TAL_" & DB_up & "_" & Format(j, "00") & ".txt")
    110. sw.WriteLine()
    111. sw.Write("more")
    112. sw.Close()
    113. End Using
    114. Batchdown = Form3.TextBox2.Text & Updatepath & "HDD_Downgrade.bat"
    115. ' Create an instance of StreamWriter to write text to a file.
    116. Using sw As IO.StreamWriter = New IO.StreamWriter(Batchdown)
    117. ' Add some text to the file.
    118. sw.Write(Form3.TextBox1.Text & talexecution & Form3.TextBox2.Text & esysconfig_down & " > " & RunFolder & "TAL_" & DB_down & "_" & Format(j, "00") & ".txt")
    119. sw.WriteLine()
    120. sw.Write("more")
    121. sw.Close()
    122. End Using
    123. End If
    124. GNLogger = Form3.TextBox13.Text & "\GNLOGGER.EXE"
    125. Dim regVersion As RegistryKey
    126. regVersion = Registry.CurrentUser.OpenSubKey("Software\innovative systems\GNLogger\logging", True)
    127. If regVersion Is Nothing Then
    128. End If
    129. regVersion.SetValue("logdir", RunFolder)
    130. Me.lblHinweis.Text = _
    131. "Achtung: Datentransfer läuft, bitte warten Sie"
    132. Me.lblHinweis.Refresh()
    133. If Form1.CheckBox2.Checked = False Then
    134. ProgressBar1.Style = ProgressBarStyle.Marquee
    135. ProgressBar1.Show()
    136. Shell(GNLogger)
    137. Shell(GNLogger)
    138. u.StartInfo.FileName = Batchup
    139. u.StartInfo.CreateNoWindow = True
    140. u.StartInfo.UseShellExecute = False
    141. u.StartInfo.RedirectStandardOutput = True
    142. Application.DoEvents()
    143. u.Start()
    144. Dim t As New System.Threading.Thread(AddressOf WaitOnBatch)
    145. t.Start()
    146. Do While u.HasExited = False
    147. Loop
    148. Shell("Taskkill /F /IM GNLOGGER.EXE /T", , True, -1)
    149. CopyTraces()
    150. Else
    151. Shell(GNLogger)
    152. Shell(GNLogger)
    153. u1.StartInfo.FileName = Batchup
    154. u1.StartInfo.CreateNoWindow = True
    155. u1.StartInfo.UseShellExecute = False
    156. u1.StartInfo.RedirectStandardOutput = True
    157. u1.Start()
    158. u1.WaitForExit()
    159. Shell("Taskkill /F /IM GNLOGGER.EXE /T", , True, -1)
    160. CopyTraces()
    161. Shell(GNLogger)
    162. Shell(GNLogger)
    163. u1.StartInfo.FileName = Batchdown
    164. u1.StartInfo.CreateNoWindow = True
    165. u1.StartInfo.UseShellExecute = False
    166. u1.StartInfo.RedirectStandardOutput = True
    167. u1.Start()
    168. u1.WaitForExit()
    169. Shell("Taskkill /F /IM GNLOGGER.EXE /T", , True, -1)
    170. CopyTraces()
    171. End If
    172. Next j
    173. Dim Result As String = TestPath & "\Result.txt"
    174. ' Create an instance of StreamWriter to write text to a file.
    175. Using sw As IO.StreamWriter = New IO.StreamWriter(Result)
    176. ' Add some text to the file.
    177. sw.Write(TextBox1.Text)
    178. sw.Close()
    179. End Using
    180. If Form1.CheckBox1.Checked Then
    181. Dim ziel As String
    182. Dim zielfolder As String
    183. Dim zielpfad As String
    184. ziel = "\\Qt-e_diagnosis\Volume_1\Diagnosis\01_Diagnosis_Testing\Diagnostic Test Results - Flash Verification HDD Gracenote\NBT-HU\"
    185. zielfolder = Test_PathBox.Text & FolderName & "\"
    186. zielpfad = ziel & zielfolder
    187. My.Computer.FileSystem.MoveDirectory(TestPath & "\", zielpfad)
    188. End If
    189. Me.lblHinweis.Text = ""
    190. Me.lblHinweis.Refresh()
    191. ProgressBar1.Value = ProgressBar1.Maximum
    192. End Sub
    193. Private Sub CopyTraces()
    194. Dim Path As String
    195. Dim searchPattern As String
    196. Path = (TestPath)
    197. searchPattern = "*.txt"
    198. IO.Directory.GetFiles(Path, searchPattern, IO.SearchOption.AllDirectories)
    199. Me.TextBox1.Text = ""
    200. Dim sb As New System.Text.StringBuilder
    201. For Each sFile As String In IO.Directory.GetFiles(Path, searchPattern, IO.SearchOption.AllDirectories)
    202. Dim File As String = IO.File.ReadAllText(sFile)
    203. sb.AppendLine(File)
    204. Next sFile
    205. Application.DoEvents()
    206. TextBox1.Text = sb.ToString
    207. Me.TextBox1.Refresh()
    208. sb = Nothing
    209. Me.Cursor = Cursors.Default
    210. Dim EDIABAS_Log As String = Form3.TextBox17.Text & "\" & "api.trc"
    211. If IO.File.Exists(EDIABAS_Log) = True Then
    212. My.Computer.FileSystem.MoveFile(EDIABAS_Log, RunFolder & "api.trc")
    213. End If
    214. Dim strFileArray As String()
    215. strFileArray = System.IO.Directory.GetFiles(Form3.TextBox18.Text, "*.log", IO.SearchOption.AllDirectories)
    216. For Each aFile As String In strFileArray
    217. Dim aFileInfo As System.IO.FileInfo = New System.IO.FileInfo(aFile)
    218. My.Computer.FileSystem.MoveFile(aFile, RunFolder & "Esys" & aFileInfo.Name)
    219. Next
    220. End Sub
    221. Private Sub CloseButton_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CloseButton.Click
    222. Me.Close()
    223. Form1.Show()
    224. Form1.Visible = True
    225. End Sub
    226. Private Sub WaitOnBatch()
    227. u.WaitForExit()
    228. End Sub
    229. End Class


    da hab ich das problem entweder es geht bleibt hängen am u.wait oder cpu last zu hoch
    im momment cpu last hoch und Progressbar ist erst sichbar wenn u.wait rum ist

    VB.NET-Quellcode

    1. ProgressBar1.Style = ProgressBarStyle.Marquee
    2. ProgressBar1.Show()
    3. Shell(GNLogger)
    4. Shell(GNLogger)
    5. u.StartInfo.FileName = Batchup
    6. u.StartInfo.CreateNoWindow = True
    7. u.StartInfo.UseShellExecute = False
    8. u.StartInfo.RedirectStandardOutput = True
    9. Application.DoEvents()
    10. u.Start()
    11. Dim t As New System.Threading.Thread(AddressOf WaitOnBatch)
    12. t.Start()
    13. Do While u.HasExited = False
    14. Loop
    15. Shell("Taskkill /F /IM GNLOGGER.EXE /T", , True, -1)
    16. CopyTraces()

    Lösung selber gefunden

    VB.NET-Quellcode

    1. u.StartInfo.FileName = Batchup
    2. u.StartInfo.CreateNoWindow = True
    3. u.StartInfo.UseShellExecute = False
    4. u.StartInfo.RedirectStandardOutput = True
    5. ProgressBar1.Style = ProgressBarStyle.Marquee
    6. Application.DoEvents()
    7. u.Start()
    8. Do Until u.HasExited
    9. Application.DoEvents()
    10. System.Threading.Thread.Sleep(200)
    11. Loop


    danke Kangaroo dein Tip wars dann mit dem Process.Start