Überbrückung der Wartezeit mit Symbol anzeigen
-
- Beiträge: 50
- Registriert: 29.03.2013 12:25
- Wohnort: Eisenach
Überbrückung der Wartezeit mit Symbol anzeigen
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
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
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.
Zum Glück wurde das in eine ProgressBar geändert. Sowas ist nicht schön.
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.
Das erinnert mich an eine ältere Notepad++-Version:Heinz Mendax hat geschrieben:Ich hatte schon eine Messagebox eingefügt, die auf das längere Warten hinweist
Zum Glück wurde das in eine ProgressBar geändert. Sowas ist nicht schön.
Re: Überbrückung der Wartezeit mit Symbol anzeigen
Meinst du so was? Ist Windows only und der Code ist suboptimal und nur als Anregung gedachtHeinz Mendax hat geschrieben:In den neueren Windowsprogrammen gibt es dafür sich drehende Bildsymbole,oft als "spinner" oder "throbber" bezeichnet.
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
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
Grundsätzlich ist es gut, dass du versuchst, jemandem zu helfen, aber nicht einfch so "hinrotzen". Vorallem nicht im Anfänger-Forum.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
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.
-
- Beiträge: 50
- Registriert: 29.03.2013 12:25
- Wohnort: Eisenach
Re: Überbrückung der Wartezeit mit Symbol anzeigen
Hallo !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.
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
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
Hallo Heinz Mendax,
richte dich doch einfach an RSBasic.
Hier einmal ein kleines Beispiel:
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
no Keyboard, press any key
no mouse, you need a cat
-
- Beiträge: 50
- Registriert: 29.03.2013 12:25
- Wohnort: Eisenach
Re: Überbrückung der Wartezeit mit Symbol anzeigen
Hallo!OpenWndWaitBox()
Repeat
evt = WaitWindowEvent()
quit = WndWaitBox_Events(evt)
Until Not quit
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
Ja!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.
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
no Keyboard, press any key
no mouse, you need a cat
Re: Überbrückung der Wartezeit mit Symbol anzeigen
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...
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
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive