Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
Salve, avrei bisogno di sapere se è possibile passare informazioni da un processo B ad un processo A che ha avviato il B; per fare un esempio prenderei in considerazione il programma 7zip che dispone di un processo A che si occupa dell'interfaccia utente che invoca un processo B per comprimere e decomprimere i file, quest'ultimo dovrebbe inviare i dati sulla compressione, come stato e progresso. Adesso non so se 7zip si occupa anche di rispondere al processo A, in ogni caso è possibile un interazione del genere?
|
|
Qwertj (Dev Team)
Guru
Messaggi: 678
Iscritto: 30/05/2011
|
Il processo chiamante può inviare degli argomenti al chiamato e "comuncare" su stdio
Codice sorgente - presumibilmente C# / VB.NET |
//invio gli argomenti uno, due, tre al nuovo processo
var child_process = New Process();
child_process.StartInfo.Arguments = "-uno -due -tre";
//reindirizza stdio del processo figlio agli stream che usiamo sotto
child_process.StartInfo.RedirectStandardOutput = true;
child_process.StartInfo.RedirectStandardInput = true;
//evita di aprire shell & finestre varie
child_process.StartInfo.UseShellExecute = false;
child_process.StartInfo.CreateNoWindow = true;
//lanciamo e aspettiamo che richieda l'input
child_process.Start();
child_process.WaitForInputIdle(); //prima di inviare qualsiasi input sarebbe bene chiamare questa funzione, accetta anche un timeout
//input
child_process.StandardInput.WriteLine("ciao!");
//output
var response = child_process.StandardOutput.ReadLine();
//ecc..
child_process.WaitForExit(); //aspetta che esca, anche questo accetta un timeout, se non vuoi aspettare chiama .Kill()
|
Il processo figlio userà normalmente stdio, ad esempio tramite Console se usa .NET, ma è compatibile anche con altri lang visto che usa uno standard (cout & cin di C++, printf & scanf di C, e così via)
Per fare un lavoro fatto bene dovresti wrappare tutto in un thread secondario così che non rallenti l'applicazione
Credo di ci siano altri metodi (magari a livello di OS), ma lascio approfondire a chi ne sa più di me
Ultima modifica effettuata da Qwertj il 13/08/2013 alle 16:25 |
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
Grazie per gli argomenti c'ero era la procedura inversa che mi mancava, ma sapresti spiegarmi come funziona, il figlio come risponde e leggo le risposte con var response = child_process.StandardOutput.ReadLine(); ok ma quando posso farlo? solo alla conclusione del processo?
|
|
GN (Member)
Guru
Messaggi: 772
Iscritto: 30/04/2011
|
Ultima modifica effettuata da GN il 13/08/2013 alle 18:57 |
|
Qwertj (Dev Team)
Guru
Messaggi: 678
Iscritto: 30/05/2011
|
Come se leggessi da console, non cambia nulla
|
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
Molto gentili
Ho optato per questa questa metodologia
Codice sorgente - presumibilmente C++ |
static void Main(string[] args) { Process child = new Process(); child.StartInfo.Arguments = Console.ReadLine(); child.StartInfo.RedirectStandardOutput = true; child.StartInfo.RedirectStandardInput = true; child.StartInfo.UseShellExecute = false; child.StartInfo.CreateNoWindow = true;//Necessario solo nei form child.OutputDataReceived += new DataReceivedEventHandler(childOutputHandler); child.StartInfo.FileName = "Child.exe"; child.Start(); child.BeginOutputReadLine(); child.WaitForExit(); Console.ReadLine(); } private static void childOutputHandler(object sender, DataReceivedEventArgs e) { if (e.Data != null) Console.WriteLine(e.Data); }
|
Però vorrei un po approfondire, se invece mi occupassi di un form come processo figlio? come invio l'output?
|
|
Qwertj (Dev Team)
Guru
Messaggi: 678
Iscritto: 30/05/2011
|
Se vuoi aggiungere un form non fai nessun task nuovo e tra form si comunica come tra due oggetti qualsiasi
Se vuoi creare un form che gira su un nuovo task, non cambia niente da sopra
|
|
Roby94 (Member)
Guru
Messaggi: 1170
Iscritto: 28/12/2009
|
No no mi riferisco a un vero programma form distaccato dal padre, non sarebbe una console, quindi come inviare dati al processo padre?
Vorrei aggiungere anche un altra domanda inerente al codice che vi ho postato, esso nasconde la console del nuovo processo, come posso verificare da questo processo se la console è nascosta oppure no?
|
|
GN (Member)
Guru
Messaggi: 772
Iscritto: 30/04/2011
|
Postato originariamente da Roby94:
No no mi riferisco a un vero programma form distaccato dal padre, non sarebbe una console, quindi come inviare dati al processo padre?
|
Credo che l'unico modo sia che il processo "figlio" possa leggere quei parametri dalla riga di comando.
Postato originariamente da Roby94:
Vorrei aggiungere anche un altra domanda inerente al codice che vi ho postato, esso nasconde la console del nuovo processo, come posso verificare da questo processo se la console è nascosta oppure no? |
Con le stesse proprietà che hai usato (non so esattamente quale delle due quindi fai delle prove)
Codice sorgente - presumibilmente Plain Text |
child.StartInfo.RedirectStandardOutput
child.StartInfo.RedirectStandardInput
|
|
|