Überbrückung der Wartezeit mit Symbol anzeigen

Anfängerfragen zum Programmieren mit PureBasic.
Heinz Mendax
Beiträge: 50
Registriert: 29.03.2013 12:25
Wohnort: Eisenach

Überbrückung der Wartezeit mit Symbol anzeigen

Beitrag von Heinz Mendax »

Hallo !
Ich habe eine Anwendung zur Bildbearbeitung erstellt, die ohne grafische Windows-formen auskommt, nur die Menüs zur Dateiauswahl und zum
Dateispeichern sind sichtbare Programmteile. Die Verarbeitung der Pixeldaten nimmt je nach Bild längere Zeit (min) in Anspruch. Während dieser
Zeit ist der Bildschirm unverändert,sodaß man denken könnte, es passiert nichts. Ich hatte schon eine Messagebox eingefügt, die auf das längere Warten hinweist. Diese muß aber beendet werden damit das Programm weiterläuft, aber auch dann ohne sichtbares Tun. In den neueren Windowsprogrammen gibt es dafür sich drehende Bildsymbole,oft als "spinner" oder "throbber" bezeichnet. Wie ist es möglich, derartige sich ändernde Symbole zur Überbrückung der Bearbeitungszeit anzuzeigen. Gut wäre es auch, wenn dieses Bildchen im Programmcode verankert wäre,damit außerhalb der EXE keine zusätzliche Datei
vorliegen muß. Praktisch vom Beginn bis zum Ende der Bildbearbeitung, also bis zur Anzeige des Dateispeicherdialogs.

mfG
Heinz
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Überbrückung der Wartezeit mit Symbol anzeigen

Beitrag von RSBasic »

Du kannst mit PB animierte Gif-Grafiken anzeigen. Lizenzfreie Wait-Animationen gibt es im Internet.
Die Grafik einfach in deinem oder in einem extra Fenster anzeigen. Die Grafik kannst du auch in deine Executable-Datei inkludieren.
Ansonsten gibt es auch ProgressBarGadget oder Systray-Wechsel-Icon, wenn du ohne Fenster machen möchtest.
Heinz Mendax hat geschrieben:Ich hatte schon eine Messagebox eingefügt, die auf das längere Warten hinweist
Das erinnert mich an eine ältere Notepad++-Version:
Bild
:lol:

Zum Glück wurde das in eine ProgressBar geändert. Sowas ist nicht schön.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Überbrückung der Wartezeit mit Symbol anzeigen

Beitrag von Josh »

Heinz Mendax hat geschrieben:In den neueren Windowsprogrammen gibt es dafür sich drehende Bildsymbole,oft als "spinner" oder "throbber" bezeichnet.
Meinst du so was? Ist Windows only und der Code ist suboptimal und nur als Anregung gedacht

Code: Alles auswählen

OpenWindow(0, 200, 200, 300, 200, "Window Cursor Wait", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)

Repeat

  hCursor = GetCursor_()
  SetCursor_(LoadCursor_(0, #IDC_WAIT))

Until WaitWindowEvent() = #PB_Event_CloseWindow
Nach beenden des Wartevorgangs musst du den Cursor mit SetCursor_(hCursor) wieder zurücksetzen.

Wenn es wirklich länger dauern sollte, dann schau mal in der Hilfe unter Threads. Damit kann dein Anwender dann den Vorgang auch unterbrechen. Aber Threads sind ein ganz eigenes Kapitel :D
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Überbrückung der Wartezeit mit Symbol anzeigen

Beitrag von RSBasic »

Josh hat geschrieben:

Code: Alles auswählen

OpenWindow(0, 200, 200, 300, 200, "Window Cursor Wait", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)

Repeat

  hCursor = GetCursor_()
  SetCursor_(LoadCursor_(0, #IDC_WAIT))

Until WaitWindowEvent() = #PB_Event_CloseWindow
Grundsätzlich ist es gut, dass du versuchst, jemandem zu helfen, aber nicht einfch so "hinrotzen". Vorallem nicht im Anfänger-Forum.
1. In einer Schleife rufst du jedes Mal GetCursor_() neu auf. Einmal reicht doch? ich würde es außerhalb der Schleife einfügen.
2. Die zweite Zeile "SetCursor_(LoadCursor_(0, #IDC_WAIT))" ist auch nicht ganz sauber. Du lädst in der Schleife jedes Mal den Cursor neu. Einmal außerhalb der Schleife reicht doch.

\\Edit:
Okay, du schreibst selber, dass dein Code suboptimal ist und nur als Anregung gedacht ist. Aber trotzdem finde ich besser, den Code schon so zu schreiben, damit Anfänger diesen Code auch korrekt übernehmen können.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Heinz Mendax
Beiträge: 50
Registriert: 29.03.2013 12:25
Wohnort: Eisenach

Re: Überbrückung der Wartezeit mit Symbol anzeigen

Beitrag von Heinz Mendax »

Du kannst mit PB animierte Gif-Grafiken anzeigen. Lizenzfreie Wait-Animationen gibt es im Internet.
Die Grafik einfach in deinem oder in einem extra Fenster anzeigen. Die Grafik kannst du auch in deine Executable-Datei inkludieren.
Ansonsten gibt es auch ProgressBarGadget oder Systray-Wechsel-Icon, wenn du ohne Fenster machen möchtest.
Hallo !
Danke für die angegebenen Möglichkeiten. Aber sind die Begriffe "Wait-Animationen" und "Systray-Wechsel-Icon" auch die, mit denen man
im Netz etwas findet. Ist nicht ein Systray-Icon ein Icon im Infobereich unterhalb der Programmfenster. Ich sehe die Verbindung zu meiner
Programmfrage nicht.
mfG
Heinz
Benutzeravatar
RSBasic
Admin
Beiträge: 8022
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Überbrückung der Wartezeit mit Symbol anzeigen

Beitrag von RSBasic »

Erstell einfach ein separates Fenster mit einer ProgressBar oder mit einem animierten Wait-Bild. Wenn die Verarbeitung fertig ist, dann kannst du das Fenster schließen oder verstecken.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
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 »

Hallo Heinz Mendax,

richte dich doch einfach an RSBasic.

Hier einmal ein kleines Beispiel:

Code: Alles auswählen

UseGIFImageDecoder()

EnableExplicit

Global WndWaitBox, evt, quit = #False

Global StBarPro, ImgWarte, BtnOk

Global PicWarte, Frame = 0

Global WaitTime = 0, Counter = 0, CountFloat.d = 0.0

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)
  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)
  WaitTime = ElapsedMilliseconds()
EndProcedure

Procedure WndWaitBox_Events(event)
  Select event
    Case #PB_Event_CloseWindow
      ProcedureReturn #False
      
    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
      Counter = ElapsedMilliseconds() - WaitTime
      If Counter <= 6000
        ;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 Counter > 0
          CountFloat = (100/5800)*Counter
          StatusBarProgress(StBarPro, 0, Int(CountFloat), #PB_StatusBar_Raised, 0, 100)
        EndIf
      Else
        DisableGadget(BtnOk, #False)
      EndIf
      
  EndSelect
  ProcedureReturn #True
EndProcedure

OpenWndWaitBox()
Repeat
  evt = WaitWindowEvent()
  quit = WndWaitBox_Events(evt)
Until Not quit
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Heinz Mendax
Beiträge: 50
Registriert: 29.03.2013 12:25
Wohnort: Eisenach

Re: Überbrückung der Wartezeit mit Symbol anzeigen

Beitrag von Heinz Mendax »

OpenWndWaitBox()
Repeat
evt = WaitWindowEvent()
quit = WndWaitBox_Events(evt)
Until Not quit
Hallo!
Ist es bei dem vorstehenden Code überhaupt möglich, das der eigentliche Programmcode
parallel ablaufen kann. Der Wartecode muss mit dem Bearbeiten des Bildes einsetzen und
mit dem Speicherdialog aufhören.

mfG
Heinz
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 »

Ist es bei dem vorstehenden Code überhaupt möglich, das der eigentliche Programmcode
parallel ablaufen kann. Der Wartecode muss mit dem Bearbeiten des Bildes einsetzen und
mit dem Speicherdialog aufhören.
Ja!

Eine genaue Erklärung folgt später. Aber probiere doch erst einmal selber.
Betriebssysteme: div. Windows, Linux, Unix - Systeme

no Keyboard, press any key
no mouse, you need a cat
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Überbrückung der Wartezeit mit Symbol anzeigen

Beitrag von mk-soft »

Um aus Threads (Bildberechnung, Laden, etc) Information für den User zu geben oder eine Userabfrage aus einem Thread zu erstellen, gibt es of Probleme.
Unter Linux und Mac dürfen Gadget aus Threads nicht geändert werden. Diese führt zu abstürzen des Programm.

Um Gadgets und Requester aus Threads zu verwenden habe ich extra ein Modul "ThreadToGUI" geschieben.

Link http://www.purebasic.fr/german/viewtopi ... hreadtogui

Einfach mal die Beispiele anschauen...
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten