[fpc-pascal] Best way to transfer data between applications?

Jorge Aldo G. de F. Junior jagfj80 at gmail.com
Tue Oct 30 05:32:39 CET 2012


Simple solution :

Use TSimpleIPC components + my own RTTIObjects unit.

All messages must be descendants of TRTTIObject. (You can use
TPersistent, but i believe my unit is neater for this specific task).

Well, using only standard components i believe you should use
TSimpleIPC components + TPersistent classes

All you need is a way to stream the TPersistent into a string or
stream then pass that resulting string/stream to the simple ipc
components.

That will do what you are asking, without much fuss...

2012/10/30 印場 乃亜 <shiruba at galapagossoftware.com>:
> Hi,
>
> I read about MSGPACK before, but it seems to be a binary version of JSON, right?
> I actually don't care about the protocol much (and since it's local, Binary vs. text wouldn't make a lot of difference in transfer speed - though using FPC  native data structures would be faster since they wouldn't have to be converted to an external format).
>
> The problem isn't just the transfer format, but the whole process.
>
> For example, I want to have something like the unix message (Signal) system that allows me to send not just an Integer, but any random data.
>
> For example, let's say I have a daemon running that receives chat messages (or something) and then it wants to send the data to the GUI, so it would call something like:
>
> SendDataToApplication(Gui_App, ChatDataRecord);
>
> Obviously, I could manually encode that data into JSON or CSV (or msgpack) and manually send it to the other app by IPC and manually decode it on the other side.  What I want is some system that will know that the incoming message is of type TCharDataRecord (or whatever) and automatically let me use that type (and not forced typecasting with pointers, etc. - but properly).  Obviously there would be limitations to any solution - for example, I would have to have the same types available on both sides, etc.
>
> I will take a look at msgpack, though, to make sure it can't do the above, though.  What little JSON I have done in FPC, I have done manually thus far, so perhaps I need to learn the capabilities of the real units before asking more.
>
> Mainly my question was asking if there is a "standard" way to do this, since it seems like a common thing to need to do.
>
>  Thank you,
>     Noah Silva
>
> On 2012/10/29, at 18:00, ik <idokan at gmail.com> wrote:
>
>> On Mon, Oct 29, 2012 at 5:52 AM, 印場 乃亜 <shiruba at galapagossoftware.com> wrote:
>>> Greetings,
>>>
>>> I am familiar with the basic underlying methods available for transferring data between processes on Windows and Unix, i.e. Pipes, Shared memory, and TCP/IP - but what I am not familiar with is any higher level functionality that may be available on FPC.
>>>
>>> As an example:  I have one application with a daemon that uses the IPC component to write to a file in CSV format, and then the user application reads this (GPS location) data via IPC.  Then I have to re-convert this string data into a series of floating point values manually, though.  The IPC component doesn't seem to be reliable on all platforms either (it sometimes blocks on OS X, and at least the debug client doesn't seem to work at all on Windows 7).
>>>
>>> Another disadvantage is that the sequence of launching the applications matters, and what's more, it seems there can only be one "client" per "server" in many cases.
>>>
>>> More to the point, if I want to pass around structures, records, etc.between processes - what is the best day?  For example, Javascript uses JSON.  I know there are JSON libraries and various other libraries for Pascal - but I don't know what is the most standard way.  (I think this kind of marshalling/unmarshalling may be more standard in Java and C#, but I don't know the "normal" way in Delphi/FPC).
>>>
>>> I would prefer to use built-in functionality, rather than learn yet another library - and if learning a library, I would prefer to use one with lots of users that is actively maintained.  Likewise, I would prefer to actually "pass" the data, rather than just pass a pointer to it.  I plan to have the processes run on the same machine, so I don't need a solution that works with networking, though that would be fine, of course.
>>>
>>> Along the same lines, a convenient way to call functions/procedures with parameters from the "other" process would be greatly appreciated.  (i.e. something like RPC that handles OOP).
>>
>> I'm writing at the moment support for msgpack (http://msgpack.org/) in
>> plain FPC (object pascal style):
>> https://github.com/ik5/fp-msgpack
>>
>> I will also implement the rpc version.
>>
>> MsgPack allow you to take data, including JSON and convert it into
>> bytes that represent the data.
>> It contain smaller version of the same way that JSON does it for example.
>>
>>
>>>
>>> Thank you,
>>>     Noah Silva
>>>
>>>
>>> _______________________________________________
>>> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
>>> http://lists.freepascal.org/mailman/listinfo/fpc-pascal
>> _______________________________________________
>> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
>> http://lists.freepascal.org/mailman/listinfo/fpc-pascal
>
> _______________________________________________
> fpc-pascal maillist  -  fpc-pascal at lists.freepascal.org
> http://lists.freepascal.org/mailman/listinfo/fpc-pascal


More information about the fpc-pascal mailing list