StartDrawing ohne StopDrawing erkennen

Fragen zu Grafik- & Soundproblemen und zur Spieleprogrammierung haben hier ihren Platz.
Benutzeravatar
Bisonte
Beiträge: 2471
Registriert: 01.04.2007 20:18

Re: StartDrawing ohne StopDrawing erkennen

Beitrag von Bisonte »

funkheld hat geschrieben: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
Dazu fällt mir nur ein...

"Ein Zauber ging am Strand entlang. Aber keiner brauchte ihn...." (Zitat : Per Anhalter durch die Galaxis / Adams)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: StartDrawing ohne StopDrawing erkennen

Beitrag von STARGÅTE »

Ein geschlossener Block mit Start- und StopDrawing ist in PB nötig, weil die 2DDrawingBefehle ohne Zielangabe arbeiten, um die nutzung zu vereinfachen.
Sachen von Windows (wie zB SetPixel) benötigen alle eine Ziehlangabe (device context, HDC).

Man kann also garnicht StartDrawing "umgehen" und eine direkte Zeichnung erlauben, da ja dann nicht klar ist, wo Plot() oder Line() wirken soll.
PB 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8812
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: StartDrawing ohne StopDrawing erkennen

Beitrag von NicTheQuick »

Ich hab eigentlich keine Lust das Thema jetzt zu sperren, deswegen hab ich mal die zwei unnötigsten Beiträge entfernt. Falls es jetzt weiterhin ausartet, geht das mit dem Sperren aber ganz schnell.
BSP
Beiträge: 201
Registriert: 01.02.2009 14:04

Re: StartDrawing ohne StopDrawing erkennen

Beitrag von BSP »

Hallo STARGATE.
Was Du schreibst, leuchtet ein.
Aber dann muß doch irgentwo vermerkt sein, das gerade ein Block offen ist und wohin der Zielt u.ä.
Das müsste man doch nutzen können, um zu prüfen, ob ein neuer Block geöffnet werden darf.
Wo / wie ist das vermerkt?

Gruß : Bernd
PB 5.31 (x86) & (x64) Win10
Benutzeravatar
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

Beitrag von ts-soft »

Ich verstehe das Problem mit dem Timer nicht, man erstellt doch sowieso nur ein Event Loop, für alle Fenster,
es sei denn, sie sind Modal. Man muss also gar nicht Wissen, ob ein StartDrawing() noch offen ist, wenn man
es sauber programmiert. Für den Timer sollte man aber besser API mit Timercallback verwenden, damit die Uhr
nicht stehen bleibt wenn ein Fenster verschoben wird, der sequenzielle Ablauf sollte dadurch eigentlich nicht
gestört sein.
Ausserdem kann man mit If StartDrawing() prüfen ob Zeichnen möglich ist.
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.
Bild
BSP
Beiträge: 201
Registriert: 01.02.2009 14:04

Re: StartDrawing ohne StopDrawing erkennen

Beitrag von BSP »

Hallo ts-soft.
Ich gebe ja zu, das ich mit den Callbacks so meine Problemchen habe.
Darum nehme ich für meine Uhr ja den API SetTimer_ .
Funktioniert im aktuellem Fenster auch ganz wunderbar.
Fenster verschieben, PopUp offen; der Timer läuft weiter.
Aber der läuft natürlich auch weiter, wenn ich gerade eine Zeichnen- Operation laufen lassen will.
Mein schicker Aktionsrahmen, eine Balkengrafik oder Textdimensionen ermitteln.
Und da kann es leicht zu konflikten kommen.
Habe ich gerade einen StartDrawing Block offen und die Uhr will auch einen solchen Block öffnen.

Wie ich das z.Z. löse, kannst Du auf Seite 1 nochmal nachlesen.

Gruß: Bernd
PB 5.31 (x86) & (x64) Win10
Benutzeravatar
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

Beitrag von ts-soft »

Durch If StartDrawing() kann da nichts passieren. Ausserdem werden alle Events sequentiell abgearbeitet,
da dürfte es keine Probleme geben. Event wird vom Callback verarbeitet, dann von PB oder umgekehrt und dann
geht es ins Eventloop, schön nacheinander.
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.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: StartDrawing ohne StopDrawing erkennen

Beitrag von STARGÅTE »

@ts-soft
If StartDrawing() würde gehen (kein absturzt), aber leider meckert der Debugger.

@BSP
Ich würde dir immer noch raten, einen echten PB-Thread zu nutzen, welcher die Uhr aktuallisiert.
Dann kannst du parallel StartDrawing öffnen ohne das sie sich beeinflussen, wenn du Thread-Safe-Exe eingeschaltet hast.
PB 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
BSP
Beiträge: 201
Registriert: 01.02.2009 14:04

Re: StartDrawing ohne StopDrawing erkennen

Beitrag von BSP »

@ts-soft.
"If StartDrawing" hilft so leider nicht.
Und von CallBacks verstehe ich noch zu wenig.

@STARGATE.
Um Thread-Safe zu nutzen, muss ich mich erst noch mit einer anderen Baustelle auseinander setzen.

Ok, ich Danke Euch beiden für die Tips.
Aber ich lasse es erst einmal so wie beschrieben.

Code: Alles auswählen

Global var

Procedure Zeichnewas()
  var = Startdrawing(...)
  ;
  StopDrawing()
  var = 0
EndProcedure

Procedure Uhr()
  If var : Procedurereturn 0: EndIf
  ;Uhr läuft nur, wenn var = 0
EndProcedure
So scheint es zumindest bisher zu laufen.

Gruß & Dank: Bernd
PB 5.31 (x86) & (x64) Win10
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: StartDrawing ohne StopDrawing erkennen

Beitrag von STARGÅTE »

Ich möchte ja nicht darauf "rumhacken", aber das Problem an dieser Vorgehensweise (mit der Hilfsvariablen) ohne Mutex, und Thread-Safe ist aber folgendes:
"If var : Procedurereturn 0: EndIf" könnte genau dann ausgeführt werden, wenn StartDrawing "intern" schon ausgeführt wurde aber noch kein Rückgabe gemacht hat.

Um mal ein extremes Beispiel für diesen Effekt zu geben, kann X in diesem Code zwei Inhalte "gleichzeitig" haben:

Code: Alles auswählen

Global X.i

Procedure WechselndesX(Null=#Null)
	Repeat
		X = 1-X
	ForEver
EndProcedure

CreateThread(@WechselndesX(), #Null)

Repeat
	If X = 1 And X = 0
		Debug "Ein Wunder, X ist 1 und 0 zugleich!"
	EndIf
	Delay(1)
ForEver
Benutze bitte stattdesse lieber einen Mutex:

Code: Alles auswählen

Global DrawingMutex = CreateMutex()

Procedure Zeichnewas()
	LockMutex(DrawingMutex)
	StartDrawing(...)
	;
	StopDrawing()
	UnlockMutex(DrawingMutex)
EndProcedure

Procedure Uhr()
	If TryLockMutex(DrawingMutex)
		;Uhr aktualisieren
		UnlockMutex(DrawingMutex)
	EndIf
EndProcedure
PB 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
Antworten