Komunikation zwischen 2 Fenstern
Übersicht

MarekBetreff: Komunikation zwischen 2 Fenstern |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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. ![]() 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 ![]() PS: Ich code dir das in 2 Minuten *angeb* |
||
Twitter
Download Jewel Snake! Windows|Android |
Marek |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 ![]() MfG Marek |
||
Wer lesen kann ist klar im Vorteil... |
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
@Smily ok, das wollte ich wissen ![]() Wenn ich das mit den Windows-Messages hinbekomm, werd ich mal nen Speedtest machen und ihn hier posten ![]() |
||
Wer lesen kann ist klar im Vorteil... |
ChristianK |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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. ![]() 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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
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 |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hehe, und wenn alles nichts hilft, die Befehle mit Prog 1 in eine Datei schreiben und mit Prog 2 auslesen lassen ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group