Two blitz apps communicating
Blitz3D Forums/Blitz3D Programming/Two blitz apps communicating
| ||
Is there an efficient way for two separate Blitz programs to communicate? I wan't my game to have two separate threads, a client and a server sending data packets back and forth. In connections through WAN I would use TCP or UDP, but when playing the game on single machine, using network to communicate is strange. I wouldn't want to use that if I don't really need to. Blitz functions that haven't catched my eye? Windows API functions? Of course if blitz3d supports multithreading, that would be solution, but I haven't found any info on that. |
| ||
The Windows window message WM_COPYDATA is built specifically for that... you may need to write a DLL for it to work happily, though. It is in User32, sent by SendMessage in the Windows API. |
| ||
I used UDP to send commands between two editors for a game I was making on the same machine (one written in blitzplus other written in blitz3d) with no problems. What is the reason you wish to not use networking commands? |
| ||
User could have the whole network service disabled, but this is of course a rare case. Using user32 sounds good, but a bit complicated. I wonder how fast it is compared to having both stuff in one exe? Writing DLL's is new to me and I have no tools make them. If this gets too difficult, I'll probably use UDP first and implement WM_COPYDATA later if needed. Or? |
| ||
Imlementing UDP properly may take as much time as doing the WM_COPYDATA thing. It is very useful because you'll learn how to use Windoes Api functions using Blitz userlib declarations. I don't know exactly about WM_COPYDATA, but usually you only need to write a DLL because Blitz doesn't support Pointers. But with a little hack this can be solved nevertheless: In the "userlibs" folder needs to be a file named "kernel32.decls" containing at least the following lines: api_RtlMoveMemory(Destination*,Source,Length) : "RtlMoveMemory" In the Blitz App you'll then be able to find out the physical adress of a bank this sway: mybank=createbank(256) pointer =AddressOf(mybank) ... Function AddressOf(Bank) ; Find the correct Adress of a Bank (for C *Pointer) Local Address = CreateBank(4) api_RtlMoveMemory(Address,Bank+4,4) Return PeekInt(Address,0) End Function Im pretty sure this WM_COPYDATA function requires such a pointer to write the Data to. An other reason why it could fail is Memory protection. Well, not sure of this, tho I managed to use a lot of Api calls directly from within blitz where other coders used to write DLLs for. |