Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

stdin und stdout mit ScreenRes

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 836
Wohnort: Ruhrpott

BeitragVerfasst am: 14.01.2014, 11:43    Titel: stdin und stdout mit ScreenRes Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 836
Wohnort: Ruhrpott

BeitragVerfasst am: 18.01.2014, 02:27    Titel: Antworten mit Zitat

Keiner eine Idee? traurig

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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5900
Wohnort: Deutschland

BeitragVerfasst am: 18.01.2014, 02:49    Titel: Grafikfenster ist pixelorientierte Zeichenfläche Antworten mit Zitat

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
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 836
Wohnort: Ruhrpott

BeitragVerfasst am: 18.01.2014, 09:25    Titel: Antworten mit Zitat

Hallo Sebastian, vielen Dank für die Antwort. lächeln

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! traurig

"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
Benutzer-Profile anzeigen Private Nachricht senden
Sebastian
Administrator


Anmeldungsdatum: 10.09.2004
Beiträge: 5900
Wohnort: Deutschland

BeitragVerfasst am: 18.01.2014, 16:13    Titel: Antworten mit Zitat

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
_________________
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden E-Mail senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz