Überbrückung der Wartezeit mit Symbol anzeigen

Anfängerfragen zum Programmieren mit PureBasic.
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Überbrückung der Wartezeit mit Symbol anzeigen

Beitrag von ccode_new »

Huhu ich bins wieder.

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
Ein Thread- Management könnte man ausbauen.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
ccode_new
Beiträge: 1214
Registriert: 27.11.2016 18:13
Wohnort: Erzgebirge

Re: Überbrückung der Wartezeit mit Symbol anzeigen

Beitrag von ccode_new »

Und hier einmal eine gemütlich dahin tapsende Thread-Lösung (ohne Threads, aber trotzdem eine asyncrone Bearbeitung)

Der Speicherverbrauch ist bei diesem Beispiel deutlich geringer.

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, weiter = 0, killThread.b = #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)

#Endbedingung = 2000

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 ClearGraphics(hCanvas)
  If StartDrawing(CanvasOutput(hCanvas))
    FillMemory(DrawingBuffer(), DrawingBufferPitch() * GadgetHeight(hCanvas), 0, #PB_Long)
    StopDrawing()
  EndIf
EndProcedure

Procedure BearbeiteBild(weiter) ;Zeichne einen Kreis (aber nicht sofort)
  ClearGraphics(CvCreative)
  If StartDrawing(CanvasOutput(CVCreative))
    DrawingMode(#PB_2DDrawing_Transparent)
    DrawImage(ImageID(EinBild), 0, 0)
    DrawText(0,0,"Ich zeichne ein Zufallskreis nach vielen Versuchen.",RGB(255,255,255), RGB(0,0,0))
    If weiter = #Endbedingung
      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 einen Kreis gezeichnet.",RGB(Random(255),Random(255),Random(255)))
    EndIf
    fertig = weiter
    If killThread = #True
      StopDrawing()
      ProcedureReturn #False
    EndIf
    StopDrawing()
  EndIf
  ProcedureReturn #True
EndProcedure

Procedure OpenWndWaitBox(x = 0, y = 0, width = 200, height = 190)
  PicWarte = CatchImage(#PB_Any, *Bild, MemorySize(*Bild))
  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 weiter < #Endbedingung
          MWahl = MessageRequester("Ende der Bearbeitung?", "Möchtest du die Bearbeitung wirklich abbrechen?", #PB_MessageRequester_YesNo)
          If MWahl = #PB_MessageRequester_Yes
            killThread = #True
            ProcedureReturn #False
          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 < #Endbedingung
        ;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/#Endbedingung)*fertig
          StatusBarProgress(StBarPro, 0, Int(CountFloat), #PB_StatusBar_Raised, 0, 100)
        EndIf
        
        BearbeiteBild(weiter)
      Else
        DisableGadget(BtnOk, #False)
      EndIf
  EndSelect
  ProcedureReturn #True
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")
  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 : weiter = 0
          killThread = #False
          If (MemoryStatus(#PB_System_FreePhysical) > (MemoryStatus(#PB_System_TotalPhysical)/5))
            DisableGadget(BtnBearbeite, #True)
            OpenWndWaitBox()
          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)
          EndIf
      EndSelect
  EndSelect
  Debug weiter
  If IsWindow(WndWaitBox) And weiter < #Endbedingung
    weiter + 1
  Else
    DisableGadget(BtnBearbeite, #False)
  EndIf
  ProcedureReturn #True
EndProcedure

OpenWndMain()
Repeat
  evt = WindowEvent()
  quit(0) = WndMain_Events(evt)
  If IsWindow(WndWaitBox)
    quit(1) = WndWaitBox_Events(evt)
    If quit(1) = #False
      CloseWindow(WndWaitBox)
    Endif
  EndIf
  Delay(20)
Until Not quit(0)
End
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Antworten