GLBasic forum

Other languages => GLBasic - de => Topic started by: S. P. Gardebiter on 2011-Sep-19

Title: 2 Programme kommunizieren lassen
Post by: S. P. Gardebiter on 2011-Sep-19
Hallo.
Ich arbeite momentan an einer Engine. Da es mit GLBasic schwierig ist und lange dauert, gute, saubere GUIs zu programmieren, möchte ich den entsprechenden Editor mit VB.NET schreiben und dann für Graphik das entsprechende GLBasic Programm einbinden. Der Editor und die Engine in Kombination müssen nur auf Windows lauffähig sein. (Anders sieht aus, wenns ums Spielen geht, dass sollte auch auf Linux und Mac möglich sein)

Jedenfalls habe ich momentan 2 Probleme:

1. Wie kann ich ein VB.NET Programm und GLBasic Programm kommunizieren lassen? (Shared Memory?)
2. Mit GLBasic kompilierte Programme sind nicht unbedingt für den Fenstermodus geeignet z.B. wird der Bildschirm komplett weiß, wenn das Fenster keinen Fokus hat. Und wenn man das Fenster wieder fokusiert, dauert es einige Zeit, bis das ganze lädt und wieder flüssig rendert. Der Cursor springt, wenn man auf das Programm in der Taskleiste klickt, etc. etc. Gibts da eine Möglichkeit, das ganze für den Fenstermodus etwas zu optimieren?
Title: Re: 2 Programme kommunizieren lassen
Post by: Kitty Hello on 2011-Sep-19
1. mach einen Port auf localhost auf und kommuniziere über TCP/IP.
2. Mach AUTOPAUSE FALSE
Title: Re: 2 Programme kommunizieren lassen
Post by: S. P. Gardebiter on 2011-Sep-19
Quote from: Kitty Hello on 2011-Sep-191. mach einen Port auf localhost auf und kommuniziere über TCP/IP.

Daran hatte ich auch schon gedacht. Allerdings ist das für mich wesentlich komplizierter als z.B. einen Weg über eine DLL zu gehen oder mit Shared Memory zu arbeiten. Ich kenne mich mit Sockets z.B. überhaupt nicht aus und verstehe von Netzwerk Programmierung noch nicht soviel. In VB.NET hatte ich schonmal etwas einfaches gemacht aber mit GLBasic noch nie. (Ausser mit den NET Befehlen)

Gibts vielleicht noch eine andere Möglichkeit? D:

Quote from: Kitty Hello on 2011-Sep-192. Mach AUTOPAUSE FALSE

Ah, danke. Das hatte ich völlig vergessen o:
Title: Re: 2 Programme kommunizieren lassen
Post by: Schranz0r on 2011-Sep-19
In den Prozess einklinken?
Sollen beide programme von dir sein?
Title: Re: 2 Programme kommunizieren lassen
Post by: Kitty Hello on 2011-Sep-19
shared memory ist wirklich immer eine schlechte Idee. Ganz schlechter Programmierstil. Viele Virenprogramme schalgen auch Alarm.
Title: Re: 2 Programme kommunizieren lassen
Post by: S. P. Gardebiter on 2011-Sep-19
Ich kann ja notfalls eine DLL über Inline C importieren.
Ich bin mir sicher, dass die NetBIOS Version in VB.NET auch nicht ohne externe DLL funktioniert ;)

Quote from: Schranz0r on 2011-Sep-19In den Prozess einklinken?

Wie jetzt?

Quote from: Schranz0r on 2011-Sep-19Sollen beide programme von dir sein?

Ja.

Edit: Es gibt doch NetBIOS Befehle in VB.NET, nagut, dann aber die anderen Sachen nicht :P
Title: Re: 2 Programme kommunizieren lassen
Post by: kanonet on 2011-Sep-20
Wenn nur sehr wenig kommuniziert werden sollte, wären Umgebungsvariablen (PUTENV,GETENV$()) doch auch eine Möglichkeit, oder?

Ich halte die Netzwerk Befehle aber auch für die am besten geeigneten, oder je nach Programm die DLL.
Title: Re: 2 Programme kommunizieren lassen
Post by: backslider on 2011-Sep-20
Wieso zeichnest du deine GUI nicht erstmal in deinem VB.Net Programm und schreibst erst beim exportieren den GLB-Code dafür?
Oder verstehe ich dich falsch?

MfG
Title: Re: 2 Programme kommunizieren lassen
Post by: Kitty Hello on 2011-Sep-20
Im Enrst - mach's über TCP/IP so machen's alle anderen auch. Tcl/Tk, VLC usw..
Das ist ja ganz einfach. Einer macht LISTEN, einer macht CONNECT, dann haben beide einen Socket über den Nachrichten geschickt werden können.
Title: Re: 2 Programme kommunizieren lassen
Post by: S. P. Gardebiter on 2011-Sep-20
Habs versucht und bin gescheitert - Fehler 10057.
Ich weiß nichtmal wie ich das ganze anstellen soll, die Hilfe ist da eher verwirrend für mich, überall werden irgendwelche Sockets wiedergegeben für irgendwas und ich habe keine Ahnung worum es überhaupt geht. Zuerst mach ich ein SOCK_INIT, danach ein SOCK_TCPLISTEN - funktioniert nicht.

Mit VB.NET hab ich da weniger Probleme, da kann mein Programm sich zumindest verbinden :x (Da hab ich nur einen Client mit Stream und sende alles über einen Streamwriter)

Quote from: backslider on 2011-Sep-20Wieso zeichnest du deine GUI nicht erstmal in deinem VB.Net Programm und schreibst erst beim exportieren den GLB-Code dafür?

Ich habe ein fertiges VB.NET Programm und ein fertiges GLBasic Programm. Das VB.NET Programm bietet die GUI und bindet das GLBasic Programm in ein Panel ein. Die Programme sollen dann miteinander kommunizieren können, damit das VB.NET Programm dem GLBasic Programm sagen kann, was es zutun hat.
Title: Re: 2 Programme kommunizieren lassen
Post by: backslider on 2011-Sep-20
Jetzt habe ich wenigstens das Problem schonmal verstanden. :D

Mich würde eine Lösung auch interessieren, da ich C# Programmierer bin.
Wenn du nichts findest, würde ich das auch demnächst mal versuchen und wenns klappt, ein Tutorial schreiben.
Ist ja fast das gleiche wie VB.Net. ;)

EDIT:
Ich habe gestern mal ein paar Zeilen geschrieben (GLB und C#) und glaube ich bin gar nicht weit von einem Weg der Kommunikation entfernt. Wenn ich nachher eine Lösung habe, sage ich bescheid... Verspreche aber nichts. ;)
Title: Re: 2 Programme kommunizieren lassen
Post by: S. P. Gardebiter on 2011-Sep-21
Quote from: Ocean on 2011-Sep-20hast Du das denn schon gelöst? Dies erscheint mir schwieriger als die IPC über TCP/IP...

Du machst wohl Witze O:

Code (glbasic) Select
        Dim MyGame As New Process

        ' Prozessinformationen
        With MyGame.StartInfo
            .FileName = "D:\GLBasic\Games\MyGame\MyGame.exe"
            .UseShellExecute = True
            .Verb = "open"
        End With

        ' Starte Prozess
        MyGame.Start()
        MyGame.WaitForInputIdle()

        ' Programm in das Panel des Splitcontainers einbetten
        SetParent(MyGame.MainWindowHandle, sct_main.Panel2.Handle)

        ' Fenster Maximieren
        SendMessage(MyGame.MainWindowHandle, WM_SYSCOMMAND, SC_MAXIMIZE, 0)


Voher noch in einem Modul folgendes importieren:

Code (glbasic) Select
    ' Api Funktionen
    Public Const WM_SYSCOMMAND As Integer = 274
    Public Const SC_MAXIMIZE As Integer = 61488
    Declare Auto Function SetParent Lib "user32.dll" (ByVal hWndChild As IntPtr, ByVal hWndNewParent As IntPtr) As Integer
    Declare Auto Function SendMessage Lib "user32.dll" (ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer


Und fertig ist die Kiste :) Kinderleicht das ganze.

Quote from: backslider on 2011-Sep-20Wenn ich nachher eine Lösung habe, sage ich bescheid... Verspreche aber nichts. ;)

Das ist nett, danke :)
Title: Re: 2 Programme kommunizieren lassen
Post by: S. P. Gardebiter on 2011-Oct-06
Gibts schon irgendwas neues?
Solange ich das nicht hinkriege, liegt mein Projekt auf Eis. :/

Code (glbasic) Select
// --------------------------------- //
// Project: BesEngine
// Start: Tuesday, September 20, 2011
// IDE Version: 10.113

GLOBAL DebugMode% = TRUE
GLOBAL EditMode% = TRUE
GLOBAL NetMode% = TRUE
GLOBAL ScreenW% = 640
GLOBAL ScreenH% = 480
GLOBAL Zoom% = 1
GLOBAL Fullscreen% = FALSE
GLOBAL FPS% = 60
GLOBAL GameTime%


SETSCREEN ScreenW, ScreenH, Fullscreen // Setup Screen
SYSTEMPOINTER TRUE // Disable Mousepointer
LIMITFPS FPS // Limit FPS
AUTOPAUSE FALSE


GLOBAL NetSocket%
GLOBAL NetSocket_Listen%
GLOBAL NetPort% = 49152
GLOBAL NetMessage$
GLOBAL NetLength% = 256
GLOBAL NetRecieve%
GLOBAL NetError$
GLOBAL NetIP%


IF NetMode% = TRUE
IF SOCK_INIT() = FALSE
END
ELSE
NetSocket_Listen% = SOCK_TCPLISTEN(NetPort%)
IF NetSocket_Listen% = -1 THEN END
ENDIF
ENDIF


WHILE TRUE

NetSocket% = SOCK_TCPACCEPT(NetSocket_Listen%, NetIP%)

IF NetSocket% <> -1

NetRecieve% = SOCK_RECV(NetSocket%, NetMessage$, NetLength%)

PRINT NetSocket_Listen%, 16, 16
PRINT NetMessage$, 16, 32
PRINT NetRecieve%, 16, 48

ENDIF

IF NetSocket% = -1 THEN NetError$ = NETGETLASTERROR$()

PRINT NetError$, 16, 64
PRINT NetSocket%, 16, 80

SHOWSCREEN

WEND

IF NetMode% = TRUE
SOCK_CLOSE(NetSocket%)
SOCK_SHUTDOWN
ENDIF

END


Wieso gibt SOCK_TCPACCEPT immer nur -1 raus und nie was anderes und das obwohl VB.NET mir sagt, es konnte sich verbinden? :S
Title: Re: 2 Programme kommunizieren lassen
Post by: Kitty Hello on 2011-Oct-06
oh, warte mal.
Wenn Du verbunden hast, dann musst Du entweder SOCK_SETBLOCKING NetSocket, TRUE machen, oder eine Schleife beim SOCK_READ, weil u.U. keine Daten da sein könnten und du dann halt nix liest und einfach beendest.

Code (glbasic) Select

SOCK_SETBLOCKING NetSocket, TRUE

NetRecieve% = SOCK_RECV(NetSocket%, NetMessage$, NetLength%)

PRINT NetSocket_Listen%, 16, 16
PRINT NetMessage$, 16, 32
PRINT NetRecieve%, 16, 48
SHOWSCREEN
MOUSEWAIT

// Wieder zu machen -> Im besten Falle natürlich _nicht_
// zumachen, sondern wiederholt versuchen davon zu lesen/schreiben
// ACHTUNG - Wenn der Socket nix sendet, wartet das Programm bis zum
// St. Nimmerleinstag!!!

// besser:
SOCK_SETBLOCKING NetSocket, FALSE // default
WHILE TRUE
NetReceive = SOCK_RECV(NetSocket, NetMessage, NetLength)
SELECT NetReceive
CASE 0 // Gegenstelle hat geendet
SOCK_CLOSE(NetSocket)
NetSocket = -1
CASE -1
// Fehler!?
CASE -2 // sind noch keine Daten da
SLEEP 10
DEFAULT // daten sind da!
BREAK // raus aus whole/true
ENDSELECT
WEND



Title: Re: 2 Programme kommunizieren lassen
Post by: S. P. Gardebiter on 2011-Oct-06
Danke, jetzt müsste es funktionieren.