startdrawing(Output-Variable) ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

startdrawing(Output-Variable) ?

Beitrag von sibru »

Hallo allerseits,

ich habe hier eine Thread-Procedure, die eine Grafik manipuliert und also StartDrawing() und StopDrawing() enthält.
Nun möchte ich diese Procedure sowohl auf ImageOutput(), WindowOutput() als auch CanvasOutput() anwenden.
Vor dem Procedure-Aufruf "OutID=ImageOutput()" / "OutID=WindowOutput()" oder "OutID=CanvasOutput()"
und OutID als Procedure-Parameter übergeben
und in Procedure "StartDrawing(OutID)" aufruden
führt zum Fehlermeldungsfreien ProgrammEnde. :shock:
Hat wer ´ne Idee ?

Oder weiß wer, wie in einer Procedure ermittelt werden kann, ob StartDrawing() bereits aktiv ist ?

danke im Vorraus...
Zuletzt geändert von sibru am 31.05.2019 12:10, insgesamt 1-mal geändert.
Bild Bild
GPI
Beiträge: 1511
Registriert: 29.08.2004 13:18
Kontaktdaten:

Re: startdrawing(Output-Variable) ?

Beitrag von GPI »

Was für ein Typ hast du für outid genommen?
CodeArchiv Rebirth: Deutsches Forum Github Hilfe ist immer gern gesehen!
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Re: startdrawing(Output-Variable) ?

Beitrag von sibru »

sowohl long also auch quad: beides funktionsfrei...
Noch ´ne wichtige Kleinigkeit: die Procedure läuft als Thread.
Bild Bild
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
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(Output-Variable) ?

Beitrag von NicTheQuick »

Nutz für sowas immer Integer. Das ist dafür gedacht. Long ist falsch und Quad auf 32-Bit-System doppelt so groß wie notwendig.

Ansonsten ist StartDrawing() in Threads nicht erlaubt, soweit ich das in Erinnerung habe. Oder vielleicht funktioniert es mal, aber mal anders nicht, also nicht gerade deterministisch. :wink:
Benutzeravatar
#NULL
Beiträge: 2239
Registriert: 20.04.2006 09:50

Re: startdrawing(Output-Variable) ?

Beitrag von #NULL »

Die Output()-id sollte möglichst nicht zwischengespeichert, sondern direkt in Verbindung mit StartDrawing() ermittelt und verwendet werden. Je nachdem was du dazwischen alles machst funktioniert das eventuell nicht.
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7035
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: startdrawing(Output-Variable) ?

Beitrag von STARGÅTE »

Nach meinen Informationen, ist die OutputID nicht "universell" gültig, sondern kann nur direkt in StartDrawing() benutzt werden.

Die Hilfe schreibt:
Gibt die OutputID zurück, oder Null wenn Zeichnen nicht möglich ist. Dieser Wert sollte direkt an die StartDrawing() Funktion übergeben werden, um die Zeichen-Operation zu starten. Der Rückgabewert ist nur gültig für eine Zeichen-Operation und kann nicht wiederverwendet werden.
Für Threads gilt somit, dass du Mutex verwenden solltest.

StartDrawing ist für Threads geeignet, jedoch halt ThreadSafe aktivieren:
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.
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
#NULL
Beiträge: 2239
Registriert: 20.04.2006 09:50

Re: startdrawing(Output-Variable) ?

Beitrag von #NULL »

Ich schätze mal, dass Output() auch im selben Thread aufgerufen werden muss wie das StartDrawing().
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8820
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(Output-Variable) ?

Beitrag von NicTheQuick »

STARGÅTE hat geschrieben:StartDrawing ist für Threads geeignet, jedoch halt ThreadSafe aktivieren:
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.
Oh, das ist cool. Ich dachte das gäbe es wieder eine Beschränkung. Das heißt prinzipiell könnte ich in mehreren Threads parallel auf verschiedene Outputs zeichnen?
sibru
Beiträge: 265
Registriert: 15.09.2004 18:11
Wohnort: hamburg

Re: startdrawing(Output-Variable) ? gelöst

Beitrag von sibru »

Danke für die Tipps, habe es jetzt mit der Brechstange gelöst... /:-> und ist _auch_ Thread-fähig :) .
Es werden einfach die diversen Möglichkeiten durchgeprüft (IsWindow(), IsImage()
oder is#PB_GadgetType_Canvas und dann enstrechend geStartDrawingt:

Code: Alles auswählen

;Template      StartDrawing_ImgNr Version 1.00 vom 31.05.2019 
;
;Funktion:  StartDrawing mit automatischer Emittlung der AusgabeID (ImageOutput()/WindowOutput()/CanvasOutput())
;           Wie bei PB-StartDrawing() wird ein 2D-Drawing-Ausgabekanal geöffnet, hier 
;           jedoch basierend auf einem Grafik-Objekt (Window-, Image- oder Canvas-Nr). 
;           Die Ausgabe-ID (WindowOutput(), ImageOutput() oder CanvasOutput()) wird 
;           automatisch ermittelt und angewendet.
;
;Aufruf:   {Typ =} StartDrawing_ImgNr(ImgNr)
;           ImgNr: das StartDrawing-Objekt, kann #WindowNr, #ImageNr oder #CanvasNr sein,
;                  das zum Grafik-Zugriff geöffnet werden soll.
;
;           Diese Funktion öffnet den Grafik-Ausgabe-Kanal (StartDrawing) und liefert den
;           entdeckten Image-Typ (siehe #ImgTyp_-Konstanten)
;           oder 0 bei ungültiger Nummer (dann auch Fehlermeldung)
;

Enumeration
  #ImgTyp_Img = 1
  #ImgTyp_Win
  #ImgTyp_Can
EndEnumeration
;#jaPBeExt exit
Procedure StartDrawing_ImgNr(ImgNr) ;- StartDrawing mit automatischer Emittlung der AusgabeID (ImageOutput()/WindowOutput()/CanvasOutput())
  Protected ImgTyp
  If IsGadget(ImgNr)
    If GadgetType(ImgNr) = #PB_GadgetType_Canvas ;{Prüfung auf Canvas
      ImgTyp = #ImgTyp_Can
      StartDrawing(CanvasOutput(ImgNr));}
    EndIf
  ElseIf IsWindow(ImgNr);{Prüfung auf Window
    ImgTyp = #ImgTyp_Win
    StartDrawing(WindowOutput(ImgNr));}
  ElseIf IsImage(ImgNr) ;{Prüfung auf Image
    ImgTyp = #ImgTyp_Img 
    StartDrawing(ImageOutput(ImgNr)) ;}
  EndIf
  If Not ImgTyp         ;{nix von dem: ErrMsg
    MessageRequester("ungültiges Grafik-Handle", "der an StartDrawing_ImgNr() übergebene " + #LF$ + "Parameter ist  keine gültiges #Fenster-, " + #LF$ + "#Image- oder #Canvas-Nummer !!!", #MB_OK|#MB_ICONERROR);}
  EndIf
  ProcedureReturn ImgTyp
EndProcedure
An der Ermittlung des StartDrawing()-Status währe ich immer noch interessiert... /:->
Bild Bild
Benutzeravatar
Bisonte
Beiträge: 2474
Registriert: 01.04.2007 20:18

Re: startdrawing(Output-Variable) ?

Beitrag von Bisonte »

Damit darfst du bloss keine Enumerationen verwenden....
Wenn jetzt #Window = 1 und #Canvas=1 (was ja funktioniert weil verschiedene Objekte )
dann hast du eine fröhliche Fehlersuche... (Wieso zeichnet der nicht da wo er soll) ;)
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​​
Antworten