Newsgroup: it.comp.programmare.win32
Titolo: GenerateConsoleCtrlEvent

Ciao a tutti,
ho un problema per cui ci sto sbattendo la testa da un po' di tempo ma
non riesco a venirne fuori..
In pratica ho un applicazione c++/mfc che mi permette di avviare una
console application (scritta in c). Quindi la mia GUI attraverso la
"CreateProcess" crea una nuova istanza di questa console application
il cui output viene rediretto su una apposita TextArea della mia GUI.
Tutto questo è stato fatto ispirandomi ad un articolo msdn (http://
support.microsoft.com/?scid=kb%3Ben-us%3B190351&x=10&y=16
).
Il mio problema è il seguente: Quando voglio terminare questa console
application, posso farlo direttamente invocando la "TerminateProcess",
pero' non'e' quello che fa al caso mio in quanto la console
application deve essere in grado di salvare sul filesystem i propri
dati prima di terminare.
Quindi ho trovato la funzione "GenerateConsoleCtrlEvent", per mandare
un CTRL_BREAK o CTRL_C alla console, ma però può essere mandata
solamente se l'applicazione che la invoca è a sua volta una console
application, quindi la mia GUI/mfc non potrà mai invocare con successo
questa funzione.. :(
Quindi vi chiedo se conoscete un rimedio al mio problema, o anche
qualche soluzione alternativa.
Grazie in anticipo a tutti!

console application (scritta in c). 
Hai accesso al codice sorgente della consolle app ?

 Hai accesso al codice sorgente della consolle app ?
Si.

Si.
beh non mi sembra molto complicato allora.
Crei un mutex nella GUI e un thread nella consolle che attende il
mutex . Quando il mutex viene rilasciato il thread della consolle fa o
predispone i suoi salvataggi e chiude l'applicazione.

 predispone i suoi salvataggi e chiude l'applicazione.
Ti ringrazio enormemente per il suggerimento.
Non avendo mai avuto prima d'ora esperienze di programmazione di
sistema su windows, ora mi rimane da capire come 2 processi possono
condividere una mutex, e poi ti farò sapere come va.
Ciao, Fabio


Si mi sto documentando un pò sull' IPC sotto windows e sto scoprendo
delle cose molto interessanti:
oltre alle mutex, ho visto che posso mandare ad un altro processo
anche un Evento, e quest'ultima soluzione mi sa che fa maggiormente al
caso mio.
Che ne pensate?

Che ne pensate?
Che il mutex e' solo uno dei molti casi possibili in cui e' possibile
risolvere il problema.
Certo vi sono strumenti anche piu semplici tipo la condivisione di un
file fittizio fra i due processi di cui uno ha l'uso esclusivo e
l'altro controlla quando il file e' rilasciato . 



Invece di scomodare i mutex, molto meglio se l'applicazione figlia legge
dallo STDIN i vari comandi che gli manda il padre.
Saluti  Manlio Perillo

 Saluti  Manlio Perillo
Giustissimo.
Me la cavo con un thread sul figlio, che mi rimane in attesa di
ricevere qualcosa dallo STDIN.
Grazie Manlio!



Di nulla e attenzione ai problemi di concorrenza!
Purtroppo Windows si basa esclusivamente su un modello a threads che non
sempre è il migliore.
Ad esempio su sistemi Unix sono disponibili i segnali i cui handler sono
chiamati all'interno del thread principale.
Saluti  Manlio Perillo

 Saluti  Manlio Perillo
Grazie ancora, però nel mio caso non vedo dove possano esserci
problemi di concorrenza perchè :
- il padre tramite la ::CreateProcess(..) crea l'applicazione console
figlia.
- attraverso la duplicazione di pipe redireziona lo STDOUT, STDIN e
STDERR del figlio.
- quando il padre vuole che il figlio termini scrive nello STDIN un
apposito messaggio.
- il figlio attraverso un apposito thread non fa altro che rimanere in
attesa di ricevere qualcosa dallo STDIN. Quando legge il messaggio di
terminazione, fa harakiri.
Scusami, ma non riesco a vedere dei problemi di concorrenza.



Il problema potrebbe esserci nell'ultimo punto, ma questo dipende da che
operazioni fai per terminare il programma.
E' una possibilità da non sottovalutare, bisogna sempre fare attenzione
con il multithreading.
Nel messaggio originale dici che devi salvare i dati generati
dall'applicazione su file.
La cosa che mi fa sorgere dei dubbi è il fatto che l'applicazione
"figlia" non termina da sola, ma è il padre che deve dirgli quando
terminare.
Potrebbe accadere quindi che l'applicazione genera dei dati in modo
continuo, e se da un thread separato salvi i dati su un file e termini
l'applicazione, potresti ritrovarti con dei dati corrotti.
Saluti  Manlio Perillo