Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  1. #1

    [C++\C#] Utilizzo di Pipe in modo non bloccante

    Ciao a tutti,
    dovendo far comunicare due applicazioni scritte in c# e in c++ vorrei valutare il sistema più opportuno.

    Il metodo più simpatico mi sembra quello delle pipe named ma se ho capito bene è necessario l'utilizzo di connect() che è bloccante.

    Il problema è che è possibile che uno dei due processi non sia attivo o non disponibile o bloccato quindi avrei la necessità di tentare una connessione ma con timeout e se ho capito bene con pipe questo non è consentito.
    Ho già letto diverse guide ma considerando che è la prima volta che mi imbatto nei sistemi IPC sotto Windows, vorrei qualche consiglio da voi prima di scrivere codice inutile e inopportuno.
    Grazie anticipatamente

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Io ho risolto il problema usando un thread a parte con un apposito timeout.
    Se il timeout scade e il thread risulta bloccato, accoppi il thread e segnali la cosa.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Bè, è un'ottima idea ma essendo il mio un progetto universitario penso che il mio prof mi ucciderebbe vedendo una cosa del genere

    Un'altra possibilità potrebbe essere il FileMapping ma mi sembra un po' più complicato e avendo dati di lunghezza variabile non vorrei incasinarmi le cose

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Io intanto butto lì una pagina da msdn, può sempre servire:
    http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx

  5. #5
    Altri metodi richiedono spesso la sincronizzazione.
    Potenzialmente ho la possibilità di condividere qualche handle di sincronizzazione o qualcosa del genere tra i due processi (visto che condividono una dll) ma vorrei evitare di complicarmi la vita.

    Vorrei fare qualcosa di semplice e per questo le pipe mi sembrano le più adatte e automatizzate. L'unico problema è il blocco di connessione! La versione non-bloccante delle pipe sembrerebbe la MailSlot che è un sistema connectionless utilizzato per broadcast ma purtroppo è stato deprecato in c# e sinceramente mettermi di nuovo a fare marshall non mi pare una grande idea. Spero che qualcuno mi dia qualche informazione illuminante sulle pipe

  6. #6
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Per capire meglio, che cosa devi condividere tra i due processi?
    Si tratta di un modello produttore/consumatore oppure è una variabile di stato che entrambi possono aggiornare oppure ...

  7. #7
    Immagina una lista di cose da comprare: string int float

    Latte 10 10,3
    Pane 1 43,2
    Farina 3 34,2

    Il numero di oggetti della lista non è conosciuto a priori tra i due processi, ma il numero di parametri si (ovvero string int float)

  8. #8
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Ok, ma questa lista la produce uno solo dei processi e l'altro è in attesa che un nuovo elemento venga scritto
    o è prodotta da entrambi o ...

  9. #9
    Si è unidirezionale. Un processo sollecita il servizio ad inviarli tramite un ServiceControlCode quindi si mette in attesa per ricevere questi dati.

    Tuttavia questi dati potrebbero non arrivare per qualche motivo quindi non posso aspettare con un sistema bloccante. Un timeout sarebbe perfetto

  10. #10
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Ora è più chiaro e a uno verrebbe da dire è un caso perfetto per un socket o una named pipe, dove il server è quello che produce questa lista.

    Non mi diventa più chiaro quando dici che i "dati potrebbero non arrivare per qualche motivo quindi non posso aspettare con un sistema bloccante". Se non arrivano più i dati sarà perché il processo server è uscito per qualche errore immagino e a questo punto cosa ci sta a fare l'altro processo da solo?

    Oppure tu vuoi un sistema diciamo client/server dove il client regolarmente controlla se il server è su o meno, Se è attivo ci si connette e scarica i dati, ma il server può essere chiuso in qualunque momento e il client deve essere in grado di gestire la situazione e provare a riconnettersi quando il server riparte.

    [EDIT] Se il tuo caso è l'ultimo che ti ho descritto prova a guardare qui riguardo al riconettersi a una named pipe rotta:
    http://stackoverflow.com/questions/6...the-named-pipe
    e più in generale qui, ma lo conoscerai già (http://msdn.microsoft.com/en-us/libr...=vs.85%29.aspx)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.