Ich habe hier einmal ein kleines Beispiel (was an einigen Stellen ausbaufähig und verbesserbar ist).
Code: Alles auswählen
UseJPEGImageDecoder()
UsePNGImageDecoder()
UseGIFImageDecoder()
;PureBasic-Bug (UseGIFImageDecoder() muss immer erst nach UsePNGImageDecoder() aufgerufen werden, sonst kann man keine PNG-Bilder laden.) - Unter Linux
EnableExplicit
Global WndMain, WndWaitBox, evt
Global Dim quit(1)
quit(0) = #False : quit(1) = #False
Global CvCreative, BtnBearbeite, BtnLade, StBarPro, ImgWarte, BtnOk
Global PicWarte, Frame = 0
Global BildThread, EinBildpfad.s, EinBild.i
Global CountFloat.d = 0.0, fertig = #False, *test
Global DasBild.s = "R0lGODlhZABnAMZiAO/v7/Hv7+3v7+3t7+nt7+vt7+ft7+fr7+Xr7+Xr7ePr7ePp7eHp7d3n7dnn7dvn7dnl7dfl7dXl69Pj69Hj68/j68vh683h68/h68vf68ff6cXd6cPd6cHd6b/b6bvb6bnZ6bvZ6bnZ57fZ57fX57XX57PX57HX563V56nT5avT56XR5afR5aPR5aPP5aHP5Z3N5ZvN45XL45fL45PJ44/J44/H443H44vH4Y3H4YXF4YHD4X7B4XzB33zB4Xq/33a/33K933S932673W6732i53Wa33WK33WC13Vyz21ix21Sx21ax21Cv20qt2U6t2Uir2Uar2UKp2UCp1z6n1zqn1zyn1zil1zql1zal1zSj1zKj1TCj1TCh1S6h1Syh1Sif1Sqf1f///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////yH/C05FVFNDQVBFMi4wAwEAAAAh/hFDcmVhdGVkIHdpdGggR0lNUAAh+QQFDwB/ACwAAAAAZABnAAAH/oAAgoOEhYaHiImKi4yNjo+QkZKTlJWWl5iZmpucnZ6foKGio6SlpqeoqaqrrK2ur7CxsrOJDWC3uLm6u7tetJM4vMLDuTa/kRTEyrzHzc7PtMvLCtCR0srU1Y/XxNnajdzD3t+L4cLj5InmvOjph+u77e6F8Lry84P1uff4APq4/RJd+BchYCId9UQYVPRknbGFiraEOwKRETcpFcEt65LR0bKOjpINA/mIhLAEJB/B2EUhJaQduUq4jETlFpKZkGjkYoGzEYhdIXoqgiDMgtBDBIg1OEpPGdNBKZYNeWqF21El4Tji5LEOysyo8ICktPCPA8l/t86i5YcPLRi2zfPcwnUnF2Tdjncz5q24F2Lfp4ADJzLpFpeAhcEK35qxUEEYxVoES55MubLly5gza97MWVWFXIVQvBiNgpCC0aPHiSZdCPWLuasE6PIqaDXq0oJcjx5km3Vt3c2S7BqkezeAEsVlAij+grhu5bS6DM9dXFCL4i2oA9eOOvuvF9OXVwdAoXhL8dvRoz7/SyKuCoNOu/a2wvWK+Lq9yR9939kLLVo0Vwhy0A1CwQorsDcIgYYcmGBnEEYo4YQUVmjhhRhmqOGGHHbo4YeWBQIAIfkEBQ8AfwAsGwBNABEABwAABzGAfygvhCh/h4dQYItQgoSPhomLk1CPloiTmZaPmJmLm4SdnoOWkX+KmY2kL6aSjH+BACH5BAUPAH8ALCUATQARAAcAAAcxgH8oL4Qof4eHUGCLUIKEj4aJi5NQj5aIk5mWj5iZi5uEnZ6DlpF/ipmNpC+mkox/gQAh+QQFDwB/ACwuAE0AEQAHAAAHMYB/KC+EKH+Hh1Bgi1CChI+GiYuTUI+WiJOZlo+YmYubhJ2eg5aRf4qZjaQvppKMf4EAIfkEBQ8AfwAsOABNABEABwAABzGAfygvhCh/h4dQYItQgoSPhomLk1CPloiTmZaPmJmLm4SdnoOWkX+KmY2kL6aSjH+BACH5BAEPAH8ALEIATQAHAAcAAAcVgH8oL4QogoSIg4iLjI2FjIaKL4aBADsVAXdpZHRoADgAAAAAAAAAFQFoZWlnaHQAQAAAAAAAAAAVAXgAKAAAAAAAAAAVAXkAMAAAAAAAAAD/////FQFldmVudAAoAAAAAAAAABUBTVdhaGwAMAAAAAAAAAD/////GAAAAAFPcGVuV25kV2FpdEJveAAiAAAAAk9wZW5XbmRXYWl0Qm94ACQAAAABV25kV2FpdEJveF9FdmVudHMAUgAAAAJXbmRXYWl0Qm94X0V2ZW50cwD/////AAAAAAQAAAAIAAAACgAAAAwAAAAOAAAAEgAAABQAAAAWAAAAGAAAABkAAAAaAAAAGwAAABwAAAAdAAAAHgAAAB8AAAAgAAAAIQAAACIAAAAkAAAAJQAAACYAAAAnAAAAKQAAACoAAAArAAAALQAAAC4AAAAvAAAAMAAAADEAAAAyAAAAMwAAADQAAAA1AAAANwAAADgAAAA5AAAAOwAAAD0AAAA+AAAAQAAAAEIAAABDAAAARAAAAEUAAABIAAAASQAAAEoAAABLAAAATAAAAE0AAABOAAAAUAAAAFEAAABSAAAAVAAAAFUAAABWAAAAVwAAAFgAAABgAAAA/////wEAAAAAAAAAAAAAAAAAAAAAAAAAL2Jpbi9zaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAQAAAAAEAAAABAAAAAAAAAAAAAADEWUQAAAAAANVZRAAAAAAAtK9EAAAAAAAAAAAAAAAAAHWvRAAAAAAAwK9EAAAAAABmr0QAAAAAAOivRAAAAAAAhK9EAAAAAAAQsEQAAAAAAJWvRAAAAAAAOLBEAAAAAACnr0QAAAAAAHCwRAAAAAAAGWFEAAAAAAA"
Global *Bild = AllocateMemory(2048)
Base64Decoder(DasBild, *Bild, 2048)
PicWarte = CatchImage(#PB_Any, *Bild, MemorySize(*Bild))
Procedure OpenWndWaitBox(x = 0, y = 0, width = 200, height = 190)
WndWaitBox = OpenWindow(#PB_Any, x, y, width, height, "Warte-Box", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
StBarPro = CreateStatusBar(#PB_Any, WindowID(WndWaitBox))
AddStatusBarField(200)
StatusBarProgress(StBarPro, 0, 0, #PB_StatusBar_Raised, 0, 100)
ImgWarte = ImageGadget(#PB_Any, 50, 0, 100, 103, ImageID(PicWarte), #PB_Image_Border)
BtnOk = ButtonGadget(#PB_Any, 65, 120, 70, 30, "OK")
DisableGadget(BtnOk, #True)
AddWindowTimer(WndWaitBox, 0, 1)
StickyWindow(WndWaitBox, #True)
EndProcedure
Procedure WndWaitBox_Events(event)
Select event
Case #PB_Event_CloseWindow
If EventWindow() = WndWaitBox
Define MWahl
If IsThread(BildThread)
PauseThread(BildThread)
MWahl = MessageRequester("Ende der Bearbeitung?", "Möchtest du die Bearbeitung wirklich abbrechen?", #PB_MessageRequester_YesNo)
If MWahl = #PB_MessageRequester_Yes
KillThread(BildThread)
ProcedureReturn #False
Else
ResumeThread(BildThread)
EndIf
Else
ProcedureReturn #False
EndIf
EndIf
Case #PB_Event_Menu
Select EventMenu()
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case BtnOk
Define MWahl
MWahl = MessageRequester("Ende", "Danke für das Warten.", #PB_MessageRequester_Info)
If MWahl = #PB_MessageRequester_Yes Or #PB_MessageRequester_Cancel
ProcedureReturn #False
EndIf
EndSelect
Case #PB_Event_Timer
If fertig < 100000
;Bild aktualisieren
SetImageFrame(PicWarte, Frame)
RemoveWindowTimer(WndWaitBox, 0)
AddWindowTimer(WndWaitBox, 0, GetImageFrameDelay(PicWarte))
SetGadgetState(ImgWarte, ImageID(PicWarte))
Frame+1
If Frame >= ImageFrameCount(PicWarte)
Frame = 0
EndIf
;Progressbar aktualisieren
If fertig > 0
CountFloat = (100/100000)*fertig
StatusBarProgress(StBarPro, 0, Int(CountFloat), #PB_StatusBar_Raised, 0, 100)
EndIf
Else
DisableGadget(BtnOk, #False)
EndIf
EndSelect
ProcedureReturn #True
EndProcedure
Procedure LadeBild()
EinBildpfad = OpenFileRequester("Bitte ein Bild wählen.", "*.bmp", "Bilder|*.bmp;*.jpeg;*.jpg;*.png;*.gif", 0)
If EinBildpfad <> ""
If IsImage(EinBild)
FreeImage(EinBild)
EndIf
If LoadImage(EinBild, EinBildpfad)
If StartDrawing(CanvasOutput(CVCreative))
ResizeImage(EinBild, GadgetWidth(CVCreative), GadgetHeight(CVCreative))
DrawAlphaImage(ImageID(EinBild), 0, 0)
StopDrawing()
Else
ProcedureReturn #False
EndIf
Else
ProcedureReturn #False
EndIf
Else
ProcedureReturn #False
EndIf
ProcedureReturn #True
EndProcedure
Procedure BearbeiteBild(*ok) ;Zeichne den 100000. Kreis
Protected i
StopDrawing()
If StartDrawing(CanvasOutput(CVCreative))
DrawImage(ImageID(EinBild), 0, 0)
For i = 0 To 100000
DrawText(0,0,"Zeichne den 100000. Kreis - Bitte warten.",RGB(255,255,255), RGB(0,0,0))
If i = 100000
DrawingMode(#PB_2DDrawing_Transparent)
DrawImage(ImageID(EinBild), 0, 0)
Circle(Random(GadgetWidth(CVCreative)), Random(GadgetHeight(CVCreative)), Random(40,6), RGB(Random(255), Random(255), Random(255)))
DrawText(0,0,"Ich habe den 100000. Kreis gezeichnet.",RGB(Random(255),Random(255),Random(255)))
DrawText(0,40,"(Eigentlich habe ich ja nur einen Kreis gezeichnet.)",RGB(Random(255),Random(255),Random(255)))
EndIf
fertig = i
Next i
i = 0
StopDrawing()
EndIf
EndProcedure
Procedure OpenWndMain(x = 0, y = 0, width = 690, height = 310)
WndMain = OpenWindow(#PB_Any, x, y, width, height, "Thread-Test", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget)
SetWindowColor(WndMain, RGB(0,255,0))
CvCreative = CanvasGadget(#PB_Any, 10, 10, 480, 290)
BtnBearbeite = ButtonGadget(#PB_Any, 500, 160, 180, 140, "Bearbeite das Bild", #PB_Button_MultiLine)
DisableGadget(BtnBearbeite, #True)
BtnLade = ButtonGadget(#PB_Any, 500, 10, 180, 140, "Lade ein Bild")
EndProcedure
Procedure WndMain_Events(event)
Select event
Case #PB_Event_CloseWindow
If EventWindow() = WndMain
ProcedureReturn #False
EndIf
Case #PB_Event_Menu
Select EventMenu()
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
Case BtnLade
If LadeBild()
DisableGadget(BtnBearbeite, #False)
Else
DisableGadget(BtnBearbeite, #True)
MessageRequester("Fehler!", "Das Bild konnte nicht geladen werden.", #PB_MessageRequester_Warning)
EndIf
Case BtnBearbeite
fertig = 0
OpenWndWaitBox()
If Not IsThread(BildThread) And Not (MemoryStatus(#PB_System_FreePhysical) < (MemoryStatus(#PB_System_TotalPhysical)/3))
BildThread = CreateThread(@BearbeiteBild(), *test)
Else
MessageRequester("Kritische Warnung!", "Du hast zu wenig Arbeitsspeicher um diesen Schritt auszuführen."+Chr(10)+"Anbei: Ich bin leider noch ein Speicherfresser.", #PB_MessageRequester_Warning)
CloseWindow(WndWaitBox)
EndIf
EndSelect
EndSelect
If IsWindow(WndWaitBox) And fertig = 100000
quit(1) = #True
EndIf
ProcedureReturn #True
EndProcedure
OpenWndMain()
Repeat
evt = WaitWindowEvent()
quit(0) = WndMain_Events(evt)
quit(1) = WndWaitBox_Events(evt)
If quit(1) = #False
CloseWindow(WndWaitBox)
ElseIf quit(0) = #False
If IsThread(BildThread)
KillThread(BildThread)
EndIf
CloseWindow(WndMain)
EndIf
Delay(20)
Until Not quit(0)
End