|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 14.01.2014, 11:43 Titel: stdin und stdout mit ScreenRes |
|
|
Hallo allerseits!
Ich habe da ein Problem: Wenn ich mit "CreateProcess(..." einen Kindprozess mit einem normalen Konsolenfenster starte, kann ich über zwei vorher entsprechend eingerichtete Pipes auf stdin bzw stdout dieses Kindprozesses zugreifen. Sobald der Kindprozess aber mit "ScreenRes" einen Grafikbildschirm geöffnet hat, ist es mit der Kommunikation vorbei. Wird das Grafikfenster mit "Screen 0" geschlossen, funktioniert alles wieder normal.
Wenn ich vor dem Offnen des Grafikfensters die Pipehandles an den Kindprozess übergebe, kann ich mit "ReadFile(..." und "WriteFile(..." weiterhin auf die Pipes zugreifen, bequemer wäre es jedoch, wenn ich stdin und stdout auf das Grafikfenster umleiten könnte.
Gibt es so eine Möglichkeit?
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 18.01.2014, 02:27 Titel: |
|
|
Keiner eine Idee?
Es würde mich auch interessieren, wenn es definitiv nicht geht.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 18.01.2014, 02:49 Titel: Grafikfenster ist pixelorientierte Zeichenfläche |
|
|
Hallo,
ich bin nicht ganz sicher, ob mir die Fragestellung ganz klar ist.
Aber zum Thema Standardeingabe/-ausgabe und SCREENRES / Grafikfenster: Wenn du in einem FreeBASIC-Programm ein Grafikfenster öffnest, handelt es sich dabei um eine pixelorientierte "Malfläche" und kein konsolenähnliches, zeichenorientiertes Fenster. Die Ausgaben, die man im Grafikfenster mit PRINT oder DRAW STRING macht, sind über eine zeichenorientierte Umleitung nicht abzugreifen. Sie werden quasi pixelweise "gemalt". Die Bitmasken für die Schriftart, die im Grafikmodus zum "Malen" der Buchstaben benutzt wird, sind auch irgendwo im gfxlib-Quelltext versteckt (komprimiert AFAIR). Das heißt, an die Ausgaben auf einem Grafik-SCREEN kommt man nicht mit Pipes heran. Da das Grafikfenster mit DirectX, GDI oder X11 arbeitet, wird man vermutlich auch keine Textdatei oder Pipe-Datenstrom auf dessen Eingabe umleiten können. Stattdessen müsste man unter Windows vermutlich Tastenanschläge simulieren, wollte man Text an MULTIKEY und Co. schleusen.
Wenn du mit der Konsole arbeiten möchtest, während das Grafikfenster geöffnet ist, musst du OPEN CONS verwenden. Dann kannst du auch Text auf die Standardausgabe schreiben, auch wenn du noch nicht via SCREEN 0 in den Textmodus zurückgeschaltet hast.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1211 Wohnort: Ruhrpott
|
Verfasst am: 18.01.2014, 09:25 Titel: |
|
|
Hallo Sebastian, vielen Dank für die Antwort.
Ganz konkret: Ich arbeite gerade an einem Projekt namens Colochessum, mit dem man zwei Schachengines gegeneinander spielen lassen und deren Spielstärke messen und vergleichen kann. Als kleine Zugabe soll das Programm noch eine Pseudo-Engine mit dem bezeichnenden Namen "human.exe" bekommen, mit der man als menschlicher Spieler gegen die auf der anderen Seite eingehängte Schachengine spielen kann, und im Zusammenhang mit der Entwicklung dieser Pseudo-Engine ist meine Frage aufgetaucht.
Die Engines werden von Colochessum als Kindprozesse mit "CreateProcess(..." gestartet und kommunizieren über je zwei Pipes mit dem Hauptprogramm. Normalerweise haben die Engines dabei überhaupt kein Fenster, aber zur Programmentwicklung finde ich es praktisch, Kontrollmeldungen ausgeben zu können. Mit dem Konsolenfenster klappt das auch ganz einwandfrei, aber sobald ich in der Pseudo-Engine ein Grafikfenster öffne, bricht die Kommunikation über die Pipes ab, und zwar in beide Richtungen. Auch wenn ich irgend etwas mit "Input" eintippe und versuche, es an den Elternprozess zu schicken, kommt es nicht an.
Wenn ich die Pipes direkt anspreche, geht es, aber stdin und stdout sind abgeschaltet.
Eigentlich ist das kein wirkliches Problem, aber ich hätte gerne die Zusammenhänge gewusst. Außerdem wäre das eine schöne Möglichkeit gewesen, ScreenRes threadsicher zu machen: Einfach ein Grafikfenster in einem eigenen Prozess starten (oder auch mehrere gleichzeitig) und die Befehle per Pipe herüberschicken. Schade!
"Open Cons" ist mir bekannt. Während der Programmentwicklung kompiliere ich Colochessum mit "fbc -s console" und kann dann über die Subs Code: | Declare Sub pCon OverLoad (t As String = "",text As String)
Declare Sub pCon (text As String)
Declare Sub pCon (t As String = "",x As Integer)
Declare Sub pCon (x As Integer)
Sub pCon(t As String = "",text As String)
'print to console window
Dim kf As Integer = FreeFile
Open Cons For Output As #kf
Print #kf, t;
Print #kf, text
Close kf
End Sub
Sub pCon(text As String)
pCon("",text)
End Sub
Sub pCon(x As Integer)
pCon("",Str(x))
End Sub
Sub pCon(t As String = "",x As Integer)
pCon(t,Str(x))
End Sub | Kontrollmeldungen im Konsolenfenster ausgeben, ohne das Hauptprogramm zu stören.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
Sebastian Administrator
Anmeldungsdatum: 10.09.2004 Beiträge: 5969 Wohnort: Deutschland
|
Verfasst am: 18.01.2014, 16:13 Titel: |
|
|
Hallo!
grindstone hat Folgendes geschrieben: | Mit dem Konsolenfenster klappt das auch ganz einwandfrei, aber sobald ich in der Pseudo-Engine ein Grafikfenster öffne, bricht die Kommunikation über die Pipes ab, und zwar in beide Richtungen. [...]
Wenn ich die Pipes direkt anspreche, geht es, aber stdin und stdout sind abgeschaltet. |
Ja, die Konsole ist dann nur noch über OPEN CONS zu erreichen. Die Befehle wie PRINT, INPUT etc. malen nur noch auf dem Grafikfenster herum, sobald du eins öffnest. Die werden dann von zeichenorientierter Ausgabe auf "Malmodus" umgeschaltet. Sobald das Grafikfenster offen ist, hast du keine Chance mehr, mit Ausgabeumleitung o. ä. an das heranzukommen, was mit PRINT o. ä. geschrieben wird. Nur noch das, was du explizit an CONS schickst, ginge.
grindstone hat Folgendes geschrieben: | "Open Cons" ist mir bekannt. [...] Kontrollmeldungen im Konsolenfenster ausgeben, ohne das Hauptprogramm zu stören |
Ausschließlich die kannst du bei einem Programm mit Grafik-SCREEN im Zusammenhang mit stdin und stdout sehen. Sobald du mit SCREEN oder SCREENRES ein Grafikfenster aufmachst, werden die Ein- und Ausgabebefehle wie PRINT, INPUT und Co. auf den "Malmodus" im Grafikmodus umgeschaltet. Alles, was auf einen Grafik-SCREEN gezeichnet wird, wird quasi ein Bild und kein Text.
Viele Grüße!
Sebastian _________________
Die gefährlichsten Familienclans | Opas Leistung muss sich wieder lohnen - für 6 bis 10 Generationen! |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|