Toon posts:

[Kylix] Communicatie tussen programma's

Pagina: 1
Acties:

Verwijderd

Topicstarter
Voor ons project (bowling score systeem) moeten wij gaan communiceren tussen verschillende applicatie's.

Nu kan dit IPC (Interprocess Communication) op verschillende manieren:

-shared memory
-pipes
-messages


Ik denk dat je met messages het meest flexibel bent.

Dus wij zouden dan in ons geval gebruiken moeten gaan maken van System V Message Queue.

Maar hoe ik deze implementatie in gedachte heb is als volgt:

Applicatie A stuurt een bericht naar de message queue.

Applicatie B heeft een aparte thread gestart bij het starten van applicatie B die continu aan het kijken is of er een nieuw bericht in de message queue staat.

Als er dan een nieuw bericht is, stopt die thread tijdelijk, stuurt het vervolgens op een bepaalde manier (?) door naar de main thread van applicatie B en die verwerkt het.

Als je dan bidirectionele verbinding wil hebben dan zou je dus ook bij applicatie A zo'n aparte thread hebben moeten draaien.

Heel dit IPC gebeuren is voor mij nieuw en ik weet dus niet of dit de goede manier is.

Is deze methode verkeerd en er is een veel betere methode?

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 18-08 22:57

Gerco

Professional Newbie

Je zou ook sockets kunnen gebruiken voor IPC, dan werkt het ook gelijk over een netwerk. Misschien ook een puntje van aandacht.

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Verwijderd

Topicstarter
Gerco schreef op 14 March 2003 @ 11:56:
Je zou ook sockets kunnen gebruiken voor IPC, dan werkt het ook gelijk over een netwerk. Misschien ook een puntje van aandacht.
Klopt maar deze programma's draaien allemaal op 1 pc dat is absoluut zeker. En misschien is het d.m.v. sockets trager?

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23-08 16:32
Verwijderd schreef op 14 March 2003 @ 12:18:
[...]
Klopt maar deze programma's draaien allemaal op 1 pc dat is absoluut zeker. En misschien is het d.m.v. sockets trager?
Hoe tijdcritisch is je systeem ? Via sockets kun je makkelijk zeer behoorlijke prestaties krijgen...

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
farlane schreef op 14 maart 2003 @ 16:12:Hoe tijdcritisch is je systeem ? Via sockets kun je makkelijk zeer behoorlijke prestaties krijgen...
Op zich niet echt super tijd kritisch. Bij bowlen heb je amerikaans systeem. Na ieder frame moet je dan van baan wisselen op een banen paar. De gegevens zullen dan van applicatie A naar applicatie B gestuurd moeten worden en omgekeerd.

Maar communicatie tussen programma's d.m.v. sockets lijkt mij toch niet echt het meeste logische als alles op 1 computer plaats vindt??


Maar als je nu een "echte" IPC vorm als bijvoorbeeld messages gebruikt, dan moet je dus altijd zelf aan allebei de kanten een aparte thread starten? Hiervoor zijn geen speciale constructies voor waarvoor het operation systeem zorgt?

  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Je zou eventueel ook (named) pipes kunnen gebruiken. En sockets zijn zo gek nog niet hoor, er zijn best aardig wat programma's op Linux die loopback gebruiken. Als je helemaal geen netwerk installeerd (dus ook geen loopback) draaien er opeens een stuk minder programma's op je systeem.

www.fendt.com | Nikon D7100 | PS5


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23-08 16:32
Verwijderd schreef op 14 March 2003 @ 21:35:
[...]
Maar communicatie tussen programma's d.m.v. sockets lijkt mij toch niet echt het meeste logische als alles op 1 computer plaats vindt??

Maar als je nu een "echte" IPC vorm als bijvoorbeeld messages gebruikt, dan moet je dus altijd zelf aan allebei de kanten een aparte thread starten? Hiervoor zijn geen speciale constructies voor waarvoor het operation systeem zorgt?
Waarom breng je geen extra laag aan tussen je 'programmalogica' en je communicatielaag ?

Je kunt dan in eerste instantie met bijvoorbeeld pipes oid gaan werken, en als je later iets anders wilt, bijvoorbeeld sockets, dan breng je die veranderingen/uitbreidingen aan in je communicatielaag.

Om op je eerste vraag terug te komen, nee zo vreemd is dat niet. :)

Je hoeft overigens niet per definitie een aparte thread te starten die de IPC afhandelt, dit zou ook heel goed in je main thread kunnen. ( Als dat is wat je bedoelt met je vraag )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Verwijderd

Topicstarter
farlane schreef op 15 maart 2003 @ 17:19:Je hoeft overigens niet per definitie een aparte thread te starten die de IPC afhandelt, dit zou ook heel goed in je main thread kunnen. ( Als dat is wat je bedoelt met je vraag )
Hoe moet je dat dan implementeren? Als je steeds in je Main thread ga checken of er een nieuw bericht is, dan loopt je programma toch vast? En in welke procedure/event moet je dan die check zetten?

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22-08 10:45

mulder

ik spuug op het trottoir

Als je denkt dat sockets 'te langzaam' zijn en je weet zeker dat de proggies op 1 PC draaien, waarom dan 2 proggies??

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Don Facundo schreef op 15 March 2003 @ 18:24:
Als je denkt dat sockets 'te langzaam' zijn en je weet zeker dat de proggies op 1 PC draaien, waarom dan 2 proggies??
Ik denk dat je bij sockets veel meer overhead hebt t.o.v. andere vormen van IPC (shared mem, pipes, enz..)

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22-08 10:45

mulder

ik spuug op het trottoir

...ja waarom dan 2 proggies?

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
Don Facundo schreef op 15 maart 2003 @ 18:32:
...ja waarom dan 2 proggies?
Aangezien er meerdere bowling banen aangestuurd moeten worden d.m.v. 1 computer. Door bijv 4 keer dezelfde applicatie op te starten kunnen ze onafhankelijk van elkaar draaien. Als er dan bijv 1 crashed, kunnen de andere mensen op de banen gewoon door bowlen.

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Sja hier komen we weer terug op waarom ik in het vorige topic zei dat ik de voorkeur gaf aan 1 proces :)

Iig zijn messages onbruikbaar als je meer dan 8 bytes aan data mee moet geven, dan krijg je namelijk geemmer met dat je het andere process leesrechten moet geven in het doorgegeven blok geheugen (access violations hoezee). Dan ben je dus met filemappings bezig, en als je die toch hebt zijn de messages overbodig en kun je net zo handig met snellere en betrouwbaardere events werken.

Sockets is enorm veel overkill voor binnen 1 computer. Computer zit zich dan te pleuris te zweten op TCP structuren en stacks die helemaal niet nodig zijn als je niet over onbetrouwbare netwerken als het Internet bezig bent.

Wat jij wilt is gewoon communicatie met pipes. Een simpele lightweight mogelijkheid om grote blokken data van process A naar process B te krijgen.

Professionele website nodig?


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23-08 16:32
curry684 schreef op 15 March 2003 @ 23:02:
Sockets is enorm veel overkill voor binnen 1 computer. Computer zit zich dan te pleuris te zweten op TCP structuren en stacks die helemaal niet nodig zijn als je niet over onbetrouwbare netwerken als het Internet bezig bent.

Wat jij wilt is gewoon communicatie met pipes. Een simpele lightweight mogelijkheid om grote blokken data van process A naar process B te krijgen.
TCP/IP wordt sinds kort ook gebruikt op 'betrouwbare' netwerken als LAN'S en zelfs als busprotocol voor remote io op de werkvloer ( ipv LON/Modbus/Profibus whatever ) ( maar half sarcastisch bedoeld )

( NB PC's die zweten op TCP structuren zijn aan vervanging toe, of zijn geen PC )

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

farlane schreef op 16 maart 2003 @ 05:08:
( maar half sarcastisch bedoeld )
Hoezo half? :)

Ik bedoelde dus dat TCP harder zweten is dan een pipe, en zeker voor een localhost loopback verbinding waar TS mee bezig is. En al hoeft de CPU maar 0.05% harder te zweten, voor de coder scheelt het wat litertjes lichaamsvocht meer of je een pipe of een socket gebruikt.

Professionele website nodig?


Verwijderd

Topicstarter
curry684 schreef op 15 March 2003 @ 23:02:Iig zijn messages onbruikbaar als je meer dan 8 bytes aan data mee moet geven
Waar staat dat dat je maar 8 bytes aan data kan mee geven? Ik heb een boek waarin heel het IPC gebeuren staat uitgelegd en daarin staat gewoon dat je de messages variabele grootte kunt geven en groter dan 8 Bytes.
Wat jij wilt is gewoon communicatie met pipes. Een simpele lightweight mogelijkheid om grote blokken data van process A naar process B te krijgen.
Maar bij pipes is er geen sprake van een message queue, dus kan je berichten kwijt raken als die heel snel achter elkaar optreden toch?

[ Voor 5% gewijzigd door Verwijderd op 16-03-2003 13:46 ]


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 23-08 16:32
:)
Ik bedoelde dus dat TCP harder zweten is dan een pipe, en zeker voor een localhost loopback verbinding waar TS mee bezig is. En al hoeft de CPU maar 0.05% harder te zweten, voor de coder scheelt het wat litertjes lichaamsvocht meer of je een pipe of een socket gebruikt.
Klopt helemaal, maar als ik de TS was zou ik een communicatieinterface definieren zodat het allemaal wat open blijft.
Mocht in de toekomst blijken dat het nodig is om het over meerdere PC's te verdelen, ben je een blije ontwikkelaar omdat het allemaal makkelijk naar sockets om te programmeren is.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

Verwijderd schreef op 16 maart 2003 @ 13:46:
Waar staat dat dat je maar 8 bytes aan data kan mee geven? Ik heb een boek waarin heel het IPC gebeuren staat uitgelegd en daarin staat gewoon dat je de messages variabele grootte kunt geven en groter dan 8 Bytes.
Je hebt naar ik mag aannemen binnen CLX dezelfde beperkingen bij messages als onder Windows: 2 DWORD size variabelen oftewel 8 bytes. Beiden kunnen een pointer zijn naar een blok geheugen van 100Mb, op die manier kun je zoveel data meegeven als je wilt. Echter, als je dit tussen processen doet moet je een manier hebben om dat blok geheugen zo te alloceren dat beide processen er leesrechten op hebben, anders is het SegFault per direct.
[...]
Maar bij pipes is er geen sprake van een message queue, dus kan je berichten kwijt raken als die heel snel achter elkaar optreden toch?
Uhm nee. Pipes zijn net zo buffered als TCP en co, anders zouden ze redelijk nutteloos zijn.

Professionele website nodig?


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 13-08 16:46

curry684

left part of the evil twins

farlane schreef op 16 maart 2003 @ 14:31:
[...]
Klopt helemaal, maar als ik de TS was zou ik een communicatieinterface definieren zodat het allemaal wat open blijft.
Mocht in de toekomst blijken dat het nodig is om het over meerdere PC's te verdelen, ben je een blije ontwikkelaar omdat het allemaal makkelijk naar sockets om te programmeren is.
Ja, hier had ik echter het voordeel dat ik voorkennis heb uit z'n vorige topic en ik weet dat de applicatie probleemloos singleprocess singlethreaded kan draaien zonder de CPU ook maar ooit in de problemen te krijgen :)

Professionele website nodig?


Verwijderd

Topicstarter
curry684 schreef op 16 March 2003 @ 19:18:Je hebt naar ik mag aannemen binnen CLX dezelfde beperkingen bij messages als onder Windows: 2 DWORD size variabelen oftewel 8 bytes. Beiden kunnen een pointer zijn naar een blok geheugen van 100Mb, op die manier kun je zoveel data meegeven als je wilt. Echter, als je dit tussen processen doet moet je een manier hebben om dat blok geheugen zo te alloceren dat beide processen er leesrechten op hebben, anders is het SegFault per direct.
In het boek dat ik heb staat een voorbeeld waarbij gebruikt gemaakt wordt van een record waarin je zelf allerlei informatie kunt zetten. Dus je kan zelf de grootte daarvan bepalen.
Uhm nee. Pipes zijn net zo buffered als TCP en co, anders zouden ze redelijk nutteloos zijn.
Wat is dan precies het verschil tussen pipes/named pipes (FIFO) en System V Message Queues?
Pagina: 1