BASIC

Author Topic: 2 Programme kommunizieren lassen  (Read 5456 times)

Offline S. P. Gardebiter

  • Mr. Polyvector
  • ***
  • Posts: 245
    • View Profile
    • Tile 44 Interactive
2 Programme kommunizieren lassen
« 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?
« Last Edit: 2011-Sep-19 by S. P. Gardebiter »
~ Cave Story rules! ~

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10711
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Re: 2 Programme kommunizieren lassen
« Reply #1 on: 2011-Sep-19 »
1. mach einen Port auf localhost auf und kommuniziere über TCP/IP.
2. Mach AUTOPAUSE FALSE

Offline S. P. Gardebiter

  • Mr. Polyvector
  • ***
  • Posts: 245
    • View Profile
    • Tile 44 Interactive
Re: 2 Programme kommunizieren lassen
« Reply #2 on: 2011-Sep-19 »
1. 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:

2. Mach AUTOPAUSE FALSE

Ah, danke. Das hatte ich völlig vergessen o:
~ Cave Story rules! ~

Offline Schranz0r

  • Premium User :)
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 5021
  • O Rly?
    • View Profile
Re: 2 Programme kommunizieren lassen
« Reply #3 on: 2011-Sep-19 »
In den Prozess einklinken?
Sollen beide programme von dir sein?
I <3 DGArray's :D

PC:
AMD RYzen 7 1700 @3.9Ghz, 16GB HyperX Fury 2666Mhz Ram, ASUS ROG GTX 1060 STRIX 6GB, Windows 10 Pro 64Bit, MSi Tomahawk B350 Mainboard

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10711
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Re: 2 Programme kommunizieren lassen
« Reply #4 on: 2011-Sep-19 »
shared memory ist wirklich immer eine schlechte Idee. Ganz schlechter Programmierstil. Viele Virenprogramme schalgen auch Alarm.

Offline S. P. Gardebiter

  • Mr. Polyvector
  • ***
  • Posts: 245
    • View Profile
    • Tile 44 Interactive
Re: 2 Programme kommunizieren lassen
« Reply #5 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 ;)

In den Prozess einklinken?

Wie jetzt?

Sollen beide programme von dir sein?

Ja.

Edit: Es gibt doch NetBIOS Befehle in VB.NET, nagut, dann aber die anderen Sachen nicht :P
« Last Edit: 2011-Sep-19 by S. P. Gardebiter »
~ Cave Story rules! ~

Offline kanonet

  • Administrator
  • Prof. Inline
  • *******
  • Posts: 1142
    • View Profile
    • My GLBasic code archiv
Re: 2 Programme kommunizieren lassen
« Reply #6 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.
Lenovo Thinkpad T430u: Intel i5-3317U, 8GB DDR3, NVidia GeForce 620M, Micron RealSSD C400 @Win7 x64

Offline backslider

  • Community Developer
  • Prof. Inline
  • ******
  • Posts: 892
    • View Profile
Re: 2 Programme kommunizieren lassen
« Reply #7 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

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10711
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Re: 2 Programme kommunizieren lassen
« Reply #8 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.

Offline S. P. Gardebiter

  • Mr. Polyvector
  • ***
  • Posts: 245
    • View Profile
    • Tile 44 Interactive
Re: 2 Programme kommunizieren lassen
« Reply #9 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)

Wieso 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.
~ Cave Story rules! ~

Offline backslider

  • Community Developer
  • Prof. Inline
  • ******
  • Posts: 892
    • View Profile
Re: 2 Programme kommunizieren lassen
« Reply #10 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. ;)
« Last Edit: 2011-Sep-21 by backslider »

Offline S. P. Gardebiter

  • Mr. Polyvector
  • ***
  • Posts: 245
    • View Profile
    • Tile 44 Interactive
Re: 2 Programme kommunizieren lassen
« Reply #11 on: 2011-Sep-21 »
hast 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.

Wenn ich nachher eine Lösung habe, sage ich bescheid... Verspreche aber nichts. ;)

Das ist nett, danke :)
~ Cave Story rules! ~

Offline S. P. Gardebiter

  • Mr. Polyvector
  • ***
  • Posts: 245
    • View Profile
    • Tile 44 Interactive
Re: 2 Programme kommunizieren lassen
« Reply #12 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
~ Cave Story rules! ~

Offline Kitty Hello

  • code monkey
  • Administrator
  • Prof. Inline
  • *******
  • Posts: 10711
  • here on my island the sea says 'hello'
    • View Profile
    • http://www.glbasic.com
Re: 2 Programme kommunizieren lassen
« Reply #13 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
                       
                       
 

Offline S. P. Gardebiter

  • Mr. Polyvector
  • ***
  • Posts: 245
    • View Profile
    • Tile 44 Interactive
Re: 2 Programme kommunizieren lassen
« Reply #14 on: 2011-Oct-06 »
Danke, jetzt müsste es funktionieren.
~ Cave Story rules! ~