Thread mit Fortschrittsanzeige
Verfasst: 14.10.2015 16:36
Hallo,
ich habe mit Threads kaum Erfahrung, und würde mich daher freuen, wenn ihr Euch folgendes "Code-Gerüst" mal ansehen würdet.
Da man ja in Threads kein GUI-Zeugs machen soll, habe ich für die Aktualisierung der Fortschrittsanzeige PostEvent() benutzt.
Sind Fehler in dem Code, oder lässt sich sonst etwas verbessern? Ich bin für jeden Hinweis dankbar.
ich habe mit Threads kaum Erfahrung, und würde mich daher freuen, wenn ihr Euch folgendes "Code-Gerüst" mal ansehen würdet.
Da man ja in Threads kein GUI-Zeugs machen soll, habe ich für die Aktualisierung der Fortschrittsanzeige PostEvent() benutzt.
Sind Fehler in dem Code, oder lässt sich sonst etwas verbessern? Ich bin für jeden Hinweis dankbar.
Code: Alles auswählen
EnableExplicit
; Windows
Enumeration
#winMain
EndEnumeration
; Gadgets
Enumeration
#btnDoIt
#btnQuit
EndEnumeration
; Statusbar
Enumeration
#status
EndEnumeration
; Custom events
Enumeration #PB_Event_FirstCustomValue
#Event_Progress
#Event_ThreadFinished
EndEnumeration
Global.i ThreadActive = #False
Procedure CopyFiles(n)
Protected.i i
For i = 1 To n
If ThreadActive = #False
Break
EndIf
Delay(1000) ; oder Dateien kopieren oder ...
PostEvent(#Event_Progress)
Next
PostEvent(#Event_ThreadFinished)
EndProcedure
#Acton$ = "Los geht's"
Procedure Main()
Protected.i n, stepSize, done, event, thread
If OpenWindow(#winMain, #PB_Ignore, #PB_Ignore, 500, 300, "Thread mit Fortschrittsanzeige") = 0
MessageRequester("Schwerer Fehler", "Hauptfenster kann nicht geöffnet werden.")
End
EndIf
ButtonGadget(#btnDoIt, 240, 230, 110, 35, #Acton$)
ButtonGadget(#btnQuit, 385, 230, 100, 35, "Beenden")
If CreateStatusBar(#status, WindowID(#winMain))
AddStatusBarField(90)
AddStatusBarField(#PB_Ignore)
EndIf
n = 20
stepSize = 100 / n
Repeat
Select WaitWindowEvent()
Case #PB_Event_Gadget
Select EventGadget()
Case #btnDoIt
If ThreadActive = #False
done = 0
StatusBarText(#status, 0, "")
StatusBarProgress(#status, 1, done)
SetGadgetText(#btnDoIt, "Abbrechen")
DisableGadget(#btnQuit, #True)
ThreadActive = #True
thread = CreateThread(@CopyFiles(), n) ; n Dateien kopieren
Else
ThreadActive = #False
EndIf
Case #btnQuit
Break
EndSelect
Case #PB_Event_CloseWindow
If ThreadActive = #False
Break
EndIf
Case #Event_Progress
done + stepSize
StatusBarText(#status, 0, Str(done) + "%")
StatusBarProgress(#status, 1, done)
Case #Event_ThreadFinished
If ThreadActive = #True
StatusBarText(#status, 0, "Fertig")
ThreadActive = #False
Else
StatusBarText(#status, 0, "Abgebrochen")
EndIf
SetGadgetText(#btnDoIt, #Acton$)
DisableGadget(#btnQuit, #False)
EndSelect
ForEver
CloseWindow(#WinMain)
EndProcedure
Main()