Seite 1 von 2

startdrawing(Output-Variable) ?

Verfasst: 31.05.2019 11:59
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...

Re: startdrawing(Output-Variable) ?

Verfasst: 31.05.2019 12:04
von GPI
Was für ein Typ hast du für outid genommen?

Re: startdrawing(Output-Variable) ?

Verfasst: 31.05.2019 12:12
von sibru
sowohl long also auch quad: beides funktionsfrei...
Noch ´ne wichtige Kleinigkeit: die Procedure läuft als Thread.

Re: startdrawing(Output-Variable) ?

Verfasst: 31.05.2019 12:18
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:

Re: startdrawing(Output-Variable) ?

Verfasst: 31.05.2019 12:21
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.

Re: startdrawing(Output-Variable) ?

Verfasst: 31.05.2019 12:21
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.

Re: startdrawing(Output-Variable) ?

Verfasst: 31.05.2019 12:25
von #NULL
Ich schätze mal, dass Output() auch im selben Thread aufgerufen werden muss wie das StartDrawing().

Re: startdrawing(Output-Variable) ?

Verfasst: 31.05.2019 12:45
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?

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

Verfasst: 31.05.2019 15:54
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... /:->

Re: startdrawing(Output-Variable) ?

Verfasst: 31.05.2019 17:07
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) ;)