Seite 2 von 3
Re: StartDrawing ohne StopDrawing erkennen
Verfasst: 05.03.2012 19:52
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)
Re: StartDrawing ohne StopDrawing erkennen
Verfasst: 05.03.2012 23:11
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.
Re: StartDrawing ohne StopDrawing erkennen
Verfasst: 05.03.2012 23:39
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.
Re: StartDrawing ohne StopDrawing erkennen
Verfasst: 06.03.2012 00:29
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
Re: StartDrawing ohne StopDrawing erkennen
Verfasst: 06.03.2012 00:49
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.
Re: StartDrawing ohne StopDrawing erkennen
Verfasst: 06.03.2012 01:12
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
Re: StartDrawing ohne StopDrawing erkennen
Verfasst: 06.03.2012 01:21
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.
Re: StartDrawing ohne StopDrawing erkennen
Verfasst: 06.03.2012 01:28
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.
Re: StartDrawing ohne StopDrawing erkennen
Verfasst: 06.03.2012 01:55
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
Re: StartDrawing ohne StopDrawing erkennen
Verfasst: 06.03.2012 02:29
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