StartDrawing ohne StopDrawing erkennen
StartDrawing ohne StopDrawing erkennen
Hallo.
Gibt es eine Möglichkeit zu erkennen,
ob ein StartDrawing - Block gerade offen ist?
Zum Hintergrund der Frage:
Ich lasse über ein "SetTimer_" eine kleine Grafik Uhr laufen.
Im Hauptprg laufen aber auch Grafikfunktionen ab.
Dabei kommt es gelegentlich in der Uhrprocedur zu konflikten
mit "StopDrawing muss erst aufgerufen werden".
Nun kann ich natürlich vor jeder Zeichenoperation die Uhr kurz ausschalten,
KillTimer_()
Oder ich setze eine Globale Var, die gesetzt und gelöscht wird.
Global op = 0
op = StartDrawing()
StopDrawing()
op = 0
In der Uhr dann "op" abfragen und g.G. abbrechen.
Schöner wäre es aber, wenn ich in der Uhrprocedure prüfen kann,
ob gerade ein "StartDrawing" offen ist.
Habt Ihr eine (einfache) Lösung?
Gruß: BSP
Gibt es eine Möglichkeit zu erkennen,
ob ein StartDrawing - Block gerade offen ist?
Zum Hintergrund der Frage:
Ich lasse über ein "SetTimer_" eine kleine Grafik Uhr laufen.
Im Hauptprg laufen aber auch Grafikfunktionen ab.
Dabei kommt es gelegentlich in der Uhrprocedur zu konflikten
mit "StopDrawing muss erst aufgerufen werden".
Nun kann ich natürlich vor jeder Zeichenoperation die Uhr kurz ausschalten,
KillTimer_()
Oder ich setze eine Globale Var, die gesetzt und gelöscht wird.
Global op = 0
op = StartDrawing()
StopDrawing()
op = 0
In der Uhr dann "op" abfragen und g.G. abbrechen.
Schöner wäre es aber, wenn ich in der Uhrprocedure prüfen kann,
ob gerade ein "StartDrawing" offen ist.
Habt Ihr eine (einfache) Lösung?
Gruß: BSP
PB 5.31 (x86) & (x64) Win10
Re: StartDrawing ohne StopDrawing erkennen
Vorab:
Es wäre einfacher für dich, wenn du AddWindowTimer von PB nehmen würdest, und bei jedem Time-Event dann deine Uhr aktuallisierst.
Ansonsten, in der Hilfe steht:
Edit: PB-Timer:
Es wäre einfacher für dich, wenn du AddWindowTimer von PB nehmen würdest, und bei jedem Time-Event dann deine Uhr aktuallisierst.
Ansonsten, in der Hilfe steht:
Die beiden StartDrawings sollten eigentlich beide aufrufbar sein, außer SetTimer_ macht gar kein Thread auf.StartDrawing() hat geschrieben:Wenn "Erstelle threadsicheres Executable" in den Compiler-Optionen aktiviert ist, dann hat jeder Thread seine eigene aktuelle Zeichenausgabe. Dies bedeutet, dass zwei Threads zur gleichen Zeit auf verschiedene Ausgaben zeichnen können.
Edit: PB-Timer:
Code: Alles auswählen
Enumeration
#Window
#Timer
#Gadget
EndEnumeration
Procedure LineAR(X.i, Y.i, Radius.i, Angle.f, Color.i)
LineXY(X, Y, X+Radius*Cos(Radian(Angle)), Y+Radius*Sin(Radian(Angle)), Color)
EndProcedure
OpenWindow(#Window, 0, 0, 300, 300, "WindowTitle", #PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
AddWindowTimer(#Window, #Timer, 20)
CanvasGadget(#Gadget, 0, 0, 300, 300)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
Case #PB_Event_Timer
Select EventTimer()
Case #Timer
StartDrawing(CanvasOutput(#Gadget))
Box(0, 0, OutputWidth(), OutputHeight(), $FFFFFF)
LineAR(200, 150, 50, 360*ElapsedMilliseconds()/1000, 0)
LineAR(150, 150, 140, 360*Second(Date())/60-90, 0)
LineAR(150, 150, 120, 360*(Minute(Date())+Second(Date())/60)/60-90, 0)
LineAR(150, 150, 90, 360*(Hour(Date())+Minute(Date())/60)/12-90, 0)
StopDrawing()
EndSelect
Case #PB_Event_Gadget
Select EventGadget()
EndSelect
EndSelect
ForEverPB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Re: StartDrawing ohne StopDrawing erkennen
Hallo STARGÅTE.
Mit AddWindowTimer hatte ich das ursprünglich auch mal gemacht.
Aber das läuft nur im aktuellem Fenster.
Auch dann, wenn ich im WaitWindowEvent() einen Wert eingebe.
WaitWindowEvent(10)
Habe ich einen Dialog offen, steht die Uhr erst einmal.
(Es sei denn, ich baue die Eventabfrage auch im DialogFenster ein).
Ein threadsicheres Executable erzeugt bei mir einen Linkerfehler. Oder so.
Und ich wollte mich nun nicht auch deswegen wieder stundenlang durch Forum wuseln,
um das Problem zu lösen.
Um an meinen derzeitigen Aufgaben zu arbeiten statt lange zu suchen habe ich nun erst einmal wieder meine "TextUhr" eingesetzt.
Obwohl mir die nicht so gut gefällt,
da das Textgadget beim aktuallisieren mit SetGadgetText immer so blöde blinkt.
Schade.
Ich hatte gehofft, es gibt über die WinApi eine schnelle & einfache Lösung.
Aber trotzdem vielen Dank für Deinen Hilfeversuch.
Gruß: Bernd (BSP)
Mit AddWindowTimer hatte ich das ursprünglich auch mal gemacht.
Aber das läuft nur im aktuellem Fenster.
Auch dann, wenn ich im WaitWindowEvent() einen Wert eingebe.
WaitWindowEvent(10)
Habe ich einen Dialog offen, steht die Uhr erst einmal.
(Es sei denn, ich baue die Eventabfrage auch im DialogFenster ein).
Ein threadsicheres Executable erzeugt bei mir einen Linkerfehler. Oder so.
Und ich wollte mich nun nicht auch deswegen wieder stundenlang durch Forum wuseln,
um das Problem zu lösen.
Um an meinen derzeitigen Aufgaben zu arbeiten statt lange zu suchen habe ich nun erst einmal wieder meine "TextUhr" eingesetzt.
Obwohl mir die nicht so gut gefällt,
da das Textgadget beim aktuallisieren mit SetGadgetText immer so blöde blinkt.
Schade.
Ich hatte gehofft, es gibt über die WinApi eine schnelle & einfache Lösung.
Aber trotzdem vielen Dank für Deinen Hilfeversuch.
Gruß: Bernd (BSP)
PB 5.31 (x86) & (x64) Win10
Re: StartDrawing ohne StopDrawing erkennen
Das sollte nicht sein. Kannst Du mal ein kleines Beispiel dazu machen, wie Du dieBSP hat geschrieben:Ein threadsicheres Executable erzeugt bei mir einen Linkerfehler. Oder so.
zwei StartDrawings benutzt und was für ein Linkerfehler dann kommt?
Ohne Threadsicher mußt Du wohl selbst sicherstellen das nur ein StartDrawing/StopDrawing
auf einmal läuft, z.B. über einen Mutex.
Code: Alles auswählen
Global drawingMutex = CreateMutex()
LockMutex(drawingMutex)
If StartDrawing( ... )
; ...
StopDrawing()
EndIf
UnlockMutex(drawingMutex)cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
Re: StartDrawing ohne StopDrawing erkennen
Hallo Danilo.
Nein, den Fehler kann ich z.Z nicht reproduzieren.
Scheinbar will mein Prg etwas haben, was ich ihm nicht biete.
(Schlecht, wenn man zu wenig Englisch kann).
Andere Prg's laufen.
Hier die Fehlermeldung:
POLink: error: Unresolved external symbol ‘_PB_StringBasePosition’.
POLink: fatal error: 1 unresolved external(s)
Das mit den MUTEX werd ich mal ausprobieren.
Gruß & Dank: Bernd
Nein, den Fehler kann ich z.Z nicht reproduzieren.
Scheinbar will mein Prg etwas haben, was ich ihm nicht biete.
(Schlecht, wenn man zu wenig Englisch kann).
Andere Prg's laufen.
Hier die Fehlermeldung:
POLink: error: Unresolved external symbol ‘_PB_StringBasePosition’.
POLink: fatal error: 1 unresolved external(s)
Das mit den MUTEX werd ich mal ausprobieren.
Gruß & Dank: Bernd
PB 5.31 (x86) & (x64) Win10
Re: StartDrawing ohne StopDrawing erkennen
Nachtrag:
Habe das mit dem Mutex mal ausprobiert, bringt aber nichts.
Nun gut.
Dann setze ich also vor jeden StartDrawing einen KillTimer_,
nach jeden StopDrawing schalte ich den Timer wieder an.
Dann sollte es dieses Problem nicht mehr geben.
Obwohl; Eventuell doch, weil es ja sein kann, das mein Prg gerade zeichnen will wenn die Uhr gerade aktualisiert.
Dann versichte ich besser auf diesen Timer und setze die Uhr direkt in die Eventschleife mit WaitWindowEvent(10) .
Mal sehen. Kommt hier ja nicht so genau drauf an. Smile.
Gruß: Bernd
Habe das mit dem Mutex mal ausprobiert, bringt aber nichts.
Nun gut.
Dann setze ich also vor jeden StartDrawing einen KillTimer_,
nach jeden StopDrawing schalte ich den Timer wieder an.
Dann sollte es dieses Problem nicht mehr geben.
Obwohl; Eventuell doch, weil es ja sein kann, das mein Prg gerade zeichnen will wenn die Uhr gerade aktualisiert.
Dann versichte ich besser auf diesen Timer und setze die Uhr direkt in die Eventschleife mit WaitWindowEvent(10) .
Mal sehen. Kommt hier ja nicht so genau drauf an. Smile.
Gruß: Bernd
PB 5.31 (x86) & (x64) Win10
-
DarkDragon
- Beiträge: 6291
- Registriert: 29.08.2004 08:37
- Computerausstattung: Hoffentlich bald keine mehr
- Kontaktdaten:
Re: StartDrawing ohne StopDrawing erkennen
Evtl. liefert OutputWidth/OutputHeight/OutputDepth einen Anhaltspunkt ob ein StartDrawing Block gerade offen ist.BSP hat geschrieben:Hallo.
Gibt es eine Möglichkeit zu erkennen,
ob ein StartDrawing - Block gerade offen ist?
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
- ts-soft
- Beiträge: 22292
- Registriert: 08.09.2004 00:57
- Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel - Wohnort: Berlin
Re: StartDrawing ohne StopDrawing erkennen
Threadsichere Version der UserLib verwenden, richtiges SubSystemBSP hat geschrieben: Hier die Fehlermeldung:
POLink: error: Unresolved external symbol ‘_PB_StringBasePosition’.
POLink: fatal error: 1 unresolved external(s)
"UserLibThreadSafe" wählen bei Tailbited UserLibs!
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.

Re: StartDrawing ohne StopDrawing erkennen
Hallo.
Habs jetzt erst mal so gelöst:
Globale var erstellt, von StartDrawing setzen lassen,
nach StopDrawing wieder auf null,
die Uhr nur laufen lassen, wenn var = 0
Ob ich damit glücklich bin, weiss ich noch nicht.
Aber erst mal scheints zu laufen.
Aber ich plane sowieso gerade die Neustrukturierung meines Prgs,
da werde ich dann mal sehen, wie ich das dann löse.
Schade. Gibt es denn keine SystemVar o.ä., die erkennt, ob gerade ZeichenOps laufen?
Das System müsste das doch auch manchmal wissen wollen; Oder?
@ts-soft.
Ach herje, wieder was neues, mit dem ich mich erst einmal auseinander setzen muss.
Na ja. Erstmal läufts so.
Ich merke mir aber Deinen Hinweis und werde mich später damit auseinander setzen.
Gruß & Dank an alle Helfer.
Bernd
Habs jetzt erst mal so gelöst:
Globale var erstellt, von StartDrawing setzen lassen,
nach StopDrawing wieder auf null,
die Uhr nur laufen lassen, wenn var = 0
Code: Alles auswählen
Global sd
Procedure Uhr()
If sd : ProcedureReturn 0 : EndIf
;
EndProcedure
Procedure Zeichne()
sd = StartDrawing(...)
;
StopDrawing()
sd = 0
EndProcedure
SetTimer_(.....)
; - Hauptschleife
Repeat
;
Until endeAber erst mal scheints zu laufen.
Aber ich plane sowieso gerade die Neustrukturierung meines Prgs,
da werde ich dann mal sehen, wie ich das dann löse.
Schade. Gibt es denn keine SystemVar o.ä., die erkennt, ob gerade ZeichenOps laufen?
Das System müsste das doch auch manchmal wissen wollen; Oder?
@ts-soft.
Ach herje, wieder was neues, mit dem ich mich erst einmal auseinander setzen muss.
Na ja. Erstmal läufts so.
Ich merke mir aber Deinen Hinweis und werde mich später damit auseinander setzen.
Gruß & Dank an alle Helfer.
Bernd
PB 5.31 (x86) & (x64) Win10
StartDrawing ohne StopDrawing erkennen [Bla]
Eigentlich kein Problem vom Purebasic-hersteller.
Dieses Startdrawing/Stopdrawing verhindert ja eigentlich ein sogenanntes Flackern.
Dieses könnte der Purebasic-hersteller einfach so Programmieren das die Grafik immer darstellbar ist mit oder ohne Startdrawing, so das dem User die Freiheit bleibt wie er die Grafik zum Zeitpunkt der Herstellung sehen möchte.
Mal sehen , wann das kommt.
Gruss
Dieses Startdrawing/Stopdrawing verhindert ja eigentlich ein sogenanntes Flackern.
Dieses könnte der Purebasic-hersteller einfach so Programmieren das die Grafik immer darstellbar ist mit oder ohne Startdrawing, so das dem User die Freiheit bleibt wie er die Grafik zum Zeitpunkt der Herstellung sehen möchte.
Mal sehen , wann das kommt.
Gruss