Komunikation zwischen 2 Fenstern

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Marek

Betreff: Komunikation zwischen 2 Fenstern

BeitragFr, Nov 02, 2007 0:56
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe ein kleines Problem. Ich habe 2 Programme, ergo auch 2 Fenster. Das eine soll dem Anderen sagen, was es zeichnen soll.
Nun frage ich mich, was ist der schnellste und beste Weg für so eine Komunikation?

Was ich bereits probiert habe: Handle's per dateien übergeben. Leider fehlgeschlagen... Ich nahm an, dass das Handle eines Bildes (oder sogar eines Buffers) nur ein Pointer auf eine Speicher-Adresse sei und somit auch von jedem Anderen Blitz-Programm genutzt werden könnte. Allerdings scheint das nicht der Fall zu sein, da Fehlermeldung: MAV Image does not exist! (bzw. Buffer does not exist!)...

Ich bin mir nicht ganz sicher, aber Dateien sind wohl sicher nicht der richtige Lösungsgedanke, da viel zu langsam. Zudem ist es nicht grade lustig, wenn jemand eine Datei kopieren will, ein Programm im Hintergrund aber ständig Daten schreibt und ausliest...

Bei TCP/UPD Verbindungen (also ein Server-/Client-System über den localhost) war ich mir nicht ganz sicher, ob die Daten dann als Download/Upload gezählt werden.

Ich hoffe hier hatte jemand schonmal ein ähnliches Problem oder einen Lösungsgedanken!

Danke schonmal im Vorraus!
MfG Marek
Wer lesen kann ist klar im Vorteil...

Tankbuster

BeitragFr, Nov 02, 2007 1:54
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Programme können doch über UDP miteinander kommunizieren! TCP würde zu lange dauern, denn wenn beide Progs auf einem Rechner laufen, kommen die Pakete sowieso immer an. Da muss man das nicht noch prüfen. Laughing
Dann schickst du dem anderen Programm einfach den Ort, an dem sich das Bild befindet. (bsw:"C:\bilder\lol.png" oder (bei dynamischer adresse) "bilder\lol.png")).
Aber wenn es nur 10 verschiedene Bilder sind, einfach alle laden, und das eine Prog sendet dan nur ein byte B. Das würde dann bedeuten DrawImage image(B),0,0

Hoffentlich kannst du mir folgen >.<

Natürlich 2 "billige" Beispiele Wink
PS: Ich code dir das in 2 Minuten *angeb*
Twitter
Download Jewel Snake!
Windows|Android
 

Marek

BeitragFr, Nov 02, 2007 2:09
Antworten mit Zitat
Benutzer-Profile anzeigen
@TankBuster
Zitat:
Bei TCP/UPD Verbindungen (also ein Server-/Client-System über den localhost) war ich mir nicht ganz sicher, ob die Daten dann als Download/Upload gezählt werden.


Auf die Idee an sich bin ich selbst schon gekommen. Nur wird das als Download/Upload gezählt?
Wer lesen kann ist klar im Vorteil...
 

ChristianK

BeitragFr, Nov 02, 2007 11:12
Antworten mit Zitat
Benutzer-Profile anzeigen
Windows bietet die Möglichkeit, Nachrichten zwischen verschiedenen Fenstern ( und Programmen ) zu senden.
Die benötigten Funktionen sind SendMessage und RegisterWindowMessage.

Dieses Feature lässt sich aber leider nur über DLLs nutzen.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Marek

BeitragFr, Nov 02, 2007 12:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, das ganze geht doch über die WinApi, man brauch doch keine extra DLL mehr dafür?

Ich habs noch nicht ausprobiert, aber im prinzip müsste das ohne eine DLL (User32.dll ausgenommen) gehen. Ich werd mich wieder melden, wenn ichs ausprobiert hab Wink Danke für die Hilfe nochmal!!!
MfG Marek
Wer lesen kann ist klar im Vorteil...
 

ChristianK

BeitragFr, Nov 02, 2007 12:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Senden geht ganz normal via Userlib, aber du wirst eine DLL brauchen, wenn du die Nachricht im anderen Fenster empfangen willst. Die wird nämlich von Blitz3D ignoriert und um das zu verhindern brauchst du eine eigene Fensterprozedur, was wiederum bedeutet, dass du Funktionszeiger brauchst und die beherrscht Blitz3D ja leider nicht.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Marek

BeitragFr, Nov 02, 2007 12:53
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann man das icht einfach mit Banks lösen? Ich bin mir nicht ganz sicher, was du mit Fensterprozedur meinst...
Aber ich denke, dass das einzig Problem beim Nachrichten empfangen, die MSG-Struktur sein wird... und die ließe sch ja per Bank "emulieren", oder nicht?
MfG Marek
Wer lesen kann ist klar im Vorteil...

Smily

BeitragFr, Nov 02, 2007 13:00
Antworten mit Zitat
Benutzer-Profile anzeigen
Das sollte einfach über einen Lokalen tcp-port laufen.. und nein, es ist kein up/donwload, solange du als host "localhost" bzw "127.0.0.1" eingibst.
Lesestoff:
gegen Softwarepatente | Netzzensur | brain.exe | Unabhängigkeitserklärung des Internets

"Wir müssen die Rechte der Andersdenkenden selbst dann beachten, wenn sie Idioten oder schädlich sind. Wir müssen aufpassen. Wachsamkeit ist der Preis der Freiheit --- Keine Zensur!"
stummi.org
 

Marek

BeitragFr, Nov 02, 2007 13:03
Antworten mit Zitat
Benutzer-Profile anzeigen
@Smily ok, das wollte ich wissen Wink

Wenn ich das mit den Windows-Messages hinbekomm, werd ich mal nen Speedtest machen und ihn hier posten Wink
Wer lesen kann ist klar im Vorteil...
 

ChristianK

BeitragFr, Nov 02, 2007 13:04
Antworten mit Zitat
Benutzer-Profile anzeigen
Eine Fensterprozedur wird immer aufgerufen, wenn eine Nachricht an ein Fenster geschickt wird.
In Blitz3D könnte die Funktion so aussehen:

Code: [AUSKLAPPEN]
Function WindowProcedure%( hwnd%, message%, wparam%, lparam% )

   ; Jetzt werden die Nachrichten ausgewertet
   Select message

      ; Das ist unsere eigenen Nachricht
      Case EIGENE_NACHRICHT
         ; ... mit anderem Fenster kommunizieren ...

      ; Fenster soll geschlossen werden
      Case WM_CLOSE
         End

   End Select

   ; Wir überlassen Windows den Rest
   Return api_DefWindowProc( hwnd, message, wparam, lparam )
End Function

Bis hier gibt's kein Problem. Jetzt muss man aber dem Fenster die Funktion auch zuweisen:

api_SetWindowLong( SystemProperty( "AppHWND" ), GWL_WNDPROC, WindowProcedure )

SetWindowLong erwartet einen Zeiger auf die Funktion, und das geht in Blitz3D leider nicht, auch nicht mit Banks. Crying or Very sad
Die einzige Möglichkeit ist, die Funktion in einer Sprache zu schreiben, die Funktionszeiger unterstützt ( C++, PureBasic, ... ) und sie dann über eine DLL in Blitz3D einzubinden.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

Marek

BeitragFr, Nov 02, 2007 13:43
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm, schade...
Ich glaub dann mach ich das ganze einfach per TCP... Hab leider keine Ahnung von C/C++ und schon gar nicht wie man da DLL's erstellt^^

Danke nochmal für die schnelle und zuverlässige Hilfe!
MfG Marek
Wer lesen kann ist klar im Vorteil...

Tankbuster

BeitragFr, Nov 02, 2007 14:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Ich glaub dann mach ich das ganze einfach per TCP

Ich denke UDp ist dafür wesentlich besser.
Twitter
Download Jewel Snake!
Windows|Android
 

X0r

BeitragSo, Nov 04, 2007 3:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Wenn du willst und dich noch nicht entschieden hast kann ich dir noch schnell eine DLL schreiben.

Edit:
Wäre das aber nicht Unsinn? Er hätte ja trotzdem logischer Weise keinen Zugriff auf das Window-Callback. Wie sollte er dann prüfen, welche Nachricht das Fenster empfangen hat?
 

ChristianK

BeitragSo, Nov 04, 2007 12:36
Antworten mit Zitat
Benutzer-Profile anzeigen
XOr hat Folgendes geschrieben:
Er hätte ja trotzdem logischer Weise keinen Zugriff auf das Window-Callback.

Genau dafür braucht man ja die DLL. Schon mal was von Subclassing gehört?
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT
 

ChristianK

BeitragSo, Nov 04, 2007 20:02
Antworten mit Zitat
Benutzer-Profile anzeigen
Tschuldigung für den Doppelpost!

Ich habe jetzt doch Funktionen zum Senden und Empfangen von Nachrichten in den MessageViewer eingebaut.
Hier klicken!
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Christoph

BeitragSo, Nov 04, 2007 20:15
Antworten mit Zitat
Benutzer-Profile anzeigen
Hehe, und wenn alles nichts hilft, die Befehle mit Prog 1 in eine Datei schreiben und mit Prog 2 auslesen lassen Smile

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group