Seite 1 von 2
Überbrückung der Wartezeit mit Symbol anzeigen
Verfasst: 08.03.2018 13:00
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
Re: Überbrückung der Wartezeit mit Symbol anzeigen
Verfasst: 08.03.2018 13:12
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:
Zum Glück wurde das in eine ProgressBar geändert. Sowas ist nicht schön.
Re: Überbrückung der Wartezeit mit Symbol anzeigen
Verfasst: 08.03.2018 15:06
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

Re: Überbrückung der Wartezeit mit Symbol anzeigen
Verfasst: 08.03.2018 15:31
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.
Re: Überbrückung der Wartezeit mit Symbol anzeigen
Verfasst: 08.03.2018 20:32
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
Re: Überbrückung der Wartezeit mit Symbol anzeigen
Verfasst: 08.03.2018 20:37
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.
Re: Überbrückung der Wartezeit mit Symbol anzeigen
Verfasst: 08.03.2018 22:55
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
Re: Überbrückung der Wartezeit mit Symbol anzeigen
Verfasst: 09.03.2018 01:27
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
Re: Überbrückung der Wartezeit mit Symbol anzeigen
Verfasst: 09.03.2018 06:04
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.
Re: Überbrückung der Wartezeit mit Symbol anzeigen
Verfasst: 09.03.2018 15:49
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...