[C++] Multiple instances met inter-proces communicatie

Pagina: 1
Acties:

  • Douwe63
  • Registratie: September 2003
  • Laatst online: 03-06 20:56
Ik ben even met een klein onderzoekje bezig en kan wel wat beginpointers gebruiken. We maken hier een applicatie op de PC die via firewire gebruik maakt van een camera. Nu willen we toestaan dat een klant meerdere instances van dezelfde applicatie opstart op dezelfde pc. (een klant mag meerdere projecten editten en gegevens van de ene naar de andere instance kopieren).

Nu willen we echter voorkomen dat een klant vanuit twee instances tegelijk iets gaat doen met de camera (hardeware botsting). Er moet dus een mechanisme komen dat waneer een klant de camera module opstart, er gekeken wordt of er al meerdere instances van hetzelfde programma draaien en of een van die instances al in de camera module zit.

Welke mechanisme/techniek zou ik het beste kunnen gebruiken om instances van onze applicatie op te sporen en daarmee te communiceren (bv een pipe) Het handigste is om gewoon van alle andere instances een boolean uit te kunnen lezen die aangeeft of die instance momenteel gebruik maakt van de camera.

Ben benieuwd......

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 18:33
Je zou een service kunnen maken die de camera hardware aanspreekt en je applicaties met die service laten communiceren.

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.


  • demonite
  • Registratie: April 2000
  • Laatst online: 29-05 08:55

demonite

the way is up

In dit geval zou ik het met een mutex proberen. Het is alweer een tijd geleden dat ik hier wat mee heb gedaan anders had ik nog wel meer nuttigs willen vertellen :)

Maar ik weet dat je hiermee ook kunt bepalen of er al meerdere instanties zijn van een applicatie, dus lijkt het me niet zo moeilijk om hiermee de camera access te beperken.

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

curry684

left part of the evil twins

Voor dit soort dingen moet je echt even aangeven welk platform je gebruikt.

Onder Windows is de correcte oplossing in ieder geval een lap shared memory dat je via een global mutex beveiligt, en waarin je de processId van de huidige 'controller' opslaat.

Net alternatief zoals farlane tevens aandraagt is een service of single-instanced app die de feitelijke communicatie doet en deze broadcast naar de clients. Als je dit via TCP of named pipes doet kunnen je clients zelfs op een andere bak draaien dan de controller :)

Professionele website nodig?


  • Douwe63
  • Registratie: September 2003
  • Laatst online: 03-06 20:56
curry684 schreef op 24 October 2003 @ 10:12:
Voor dit soort dingen moet je echt even aangeven welk platform je gebruikt.

Onder Windows is de correcte oplossing in ieder geval een lap shared memory dat je via een global mutex beveiligt, en waarin je de processId van de huidige 'controller' opslaat.
Sorry, het is op het windows 2000/NT/XP platform en we maken gebruik van Visual Studio .Net 2003.

Dat van die mutex is wel makkelijk, dat gaan we maar eens proberen.

Kan ik dan wel als andere instance bij de inhoud van het shared memory? Dan zou ik daar de naam van de module en het open project van de instance die op dit moment de hardware gelocked heeft kunnen opslaan.

Als een andere instance dan checkt of de mutex gebruikt is dan kan ik een melding afdrukken, hardware wordt al gebruikt door de instance die project X open heeft en zich bevind in module Y.

Is dat mogelijk?

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

curry684

left part of the evil twins

Als je nu eens leest wat je citeert ;)

Zoals ik dus zeg: pak een global named mutex, gebruik die om de access te beveiliging naar een MemoryMapped File (klik hier), en sla in dat blok geheugen de processId op van de huidige controller.
Kan ik dan wel als andere instance bij de inhoud van het shared memory?
Dit was een retorische vraag hoop ik? ;)

Professionele website nodig?


  • Douwe63
  • Registratie: September 2003
  • Laatst online: 03-06 20:56
curry684 schreef op 24 October 2003 @ 11:07:
Als je nu eens leest wat je citeert ;)

Zoals ik dus zeg: pak een global named mutex, gebruik die om de access te beveiliging naar een MemoryMapped File (klik hier), en sla in dat blok geheugen de processId op van de huidige controller.

[...]
Dit was een retorische vraag hoop ik? ;)
Ik wordt (alweer) op het verkeerde been gezet door je opmerking dat je een mutex gebruikt om access naar het memory te beveiligen (vandaar dat ik even vroeg of ik er dan vanuit een andere instance nog wel bij kon komen).

Nu moet ik eens even op zoek naar een praktisch voorbeeld voor zo'n memorymapped file. Het nadeel van msdn is vaak dat er niet direct een goed voorbeeld bij staat. Puur een syntax van de functies zegt (mij) nog niet zoveel.

Ik begeef me nu voor het eerst op het M$ / Windows platform en alle begin is moeilijk ;)

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

curry684

left part of the evil twins

Ik gaf die link niet voor niets, recht daaronder staat nl. deze link die het exact stap voor stap uitlegt, en dit voorbeeld inclusief code.

MSDN is met ruime voorsprong de beste documentatie database ter wereld, en dat zeg ik niet omdat er Windowshippie onder m'n nick staat. Dus je opmerking over dat MSDN geen goede voorbeelden heeft is ronduit onzin ;)

Ik wil je trouwens vragen om geen termen als M$, Mickeysoft, Linsux, Debious en etcetera hier te bezigen, die nodigen over het algemeen uit tot flamewars en voegen weinig toe aan een discussie. Het bedrijf heet Microsoft en dat kort je af tot MS :Y)

Professionele website nodig?


  • Douwe63
  • Registratie: September 2003
  • Laatst online: 03-06 20:56
curry684 schreef op 24 October 2003 @ 11:29:
Ik gaf die link niet voor niets, recht daaronder staat nl. deze link die het exact stap voor stap uitlegt, en dit voorbeeld inclusief code.

MSDN is met ruime voorsprong de beste documentatie database ter wereld, en dat zeg ik niet omdat er Windowshippie onder m'n nick staat. Dus je opmerking over dat MSDN geen goede voorbeelden heeft is ronduit onzin ;)

Ik wil je trouwens vragen om geen termen als M$, Mickeysoft, Linsux, Debious en etcetera hier te bezigen, die nodigen over het algemeen uit tot flamewars en voegen weinig toe aan een discussie. Het bedrijf heet Microsoft en dat kort je af tot MS :Y)
Point taken, zal ik niet meer doen :Y)

Het voorbeeld wat jij aanhaalt daar kan ik niet zoveel mee. Het is allemaal vrij abstract, ik moet er eerst dieper in duiken.

Ik verwacht gewoon een praktisch voorbeeld waarbij een memory mapped file wordt aangemaakt en waar een aantal variabelen wordt weggeschreven en de code die nodig is om dezelfde info in een andere instance weer uit de memory mapped file te halen.

Maar ik moet er even dieper induiken, in ieder geval bedankt voor je tips. Ik kom er nu wel uit.

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

curry684

left part of the evil twins

Douwe63 schreef op 24 October 2003 @ 11:42:
Het voorbeeld wat jij aanhaalt daar kan ik niet zoveel mee. Het is allemaal vrij abstract, ik moet er eerst dieper in duiken.

Ik verwacht gewoon een praktisch voorbeeld waarbij een memory mapped file wordt aangemaakt en waar een aantal variabelen wordt weggeschreven en de code die nodig is om dezelfde info in een andere instance weer uit de memory mapped file te halen.

Heb je die 2e link met het voorbeeld uberhaupt wel gelezen?!? :?

Professionele website nodig?


  • Douwe63
  • Registratie: September 2003
  • Laatst online: 03-06 20:56
curry684 schreef op 24 oktober 2003 @ 11:44:

[...]

Heb je die 2e link met het voorbeeld uberhaupt wel gelezen?!? :?
Zekers, ik kom via via zelfs bij het lezen/schrijven van een file view.

http://msdn.microsoft.com...ting_from_a_file_view.asp

Alleen wil ik nu meerdere variabelen wegschrijven/ophalen. Het beste kan ik dit toch doen met een structure (met fixed lengtes van strings etc.)?

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

curry684

left part of the evil twins

Yup, u begint 'm door te hebben :)

Professionele website nodig?


  • demonite
  • Registratie: April 2000
  • Laatst online: 29-05 08:55

demonite

the way is up

Ik vraag me af waarom je een stuk shared memory gaat beveiligen met een process ID daarin om zo te achterhalen dat er al een andere instantie met die camera bezig is.

ipv dat stuk geheugen kan je toch het entrypoint naar die camera beveiligen met dezelfde mutex ?

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

curry684

left part of the evil twins

demonite schreef op 24 October 2003 @ 12:44:
Ik vraag me af waarom je een stuk shared memory gaat beveiligen met een process ID daarin om zo te achterhalen dat er al een andere instantie met die camera bezig is.

ipv dat stuk geheugen kan je toch het entrypoint naar die camera beveiligen met dezelfde mutex ?

Hij wil de data waarin opgeslagen is wie de camera 'bezit' sharen met de andere applicaties, en naar ik gok tevens een soort van 'queue' bouwen wie als volgende recht heeft. Hiervoor heb je dus true Inter Proces Communication nodig ipv een simpele mutex.

De mutex in mijn beschrijving is enkel nodig om het schrijven in het shared memory veilig te laten verlopen.

Het zou overigens helpen als Douwe63 uitgebreid uiteen zou zetten wat de applicaties zoal onderling moeten communiceren en wat de einddoelen zijn, dan kan ik specifieker aangeven wat nodig en gewenst is.

Professionele website nodig?


  • Douwe63
  • Registratie: September 2003
  • Laatst online: 03-06 20:56
curry684 schreef op 24 October 2003 @ 12:48:

[...]

Hij wil de data waarin opgeslagen is wie de camera 'bezit' sharen met de andere applicaties, en naar ik gok tevens een soort van 'queue' bouwen wie als volgende recht heeft. Hiervoor heb je dus true Inter Proces Communication nodig ipv een simpele mutex.

De mutex in mijn beschrijving is enkel nodig om het schrijven in het shared memory veilig te laten verlopen.
Precies, het bij houden van zo'n queue is nog niet eens nodig, het gaat alleen om het bijhouden 'of' en 'wie' momenteel bezit heeft van de hardware.

Dank u allen voor uw support :)
Pagina: 1