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()
