Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C# / VB.NET - [C#]Passare dati informazioni tra processi
Forum - C# / VB.NET - [C#]Passare dati informazioni tra processi

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 14:41
Martedì, 13/08/2013
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?

PM Quote
Avatar
Qwertj (Dev Team)
Guru


Messaggi: 678
Iscritto: 30/05/2011

Segnala al moderatore
Postato alle 16:17
Martedì, 13/08/2013
Il processo chiamante può inviare degli argomenti al chiamato e "comuncare" su stdio

Codice sorgente - presumibilmente C# / VB.NET

  1. //invio gli argomenti uno, due, tre al nuovo processo
  2. var child_process = New Process();
  3. child_process.StartInfo.Arguments = "-uno -due -tre";
  4. //reindirizza stdio del processo figlio agli stream che usiamo sotto
  5. child_process.StartInfo.RedirectStandardOutput = true;
  6. child_process.StartInfo.RedirectStandardInput = true;
  7. //evita di aprire shell & finestre varie
  8. child_process.StartInfo.UseShellExecute = false;
  9. child_process.StartInfo.CreateNoWindow = true;
  10. //lanciamo e aspettiamo che richieda l'input
  11. child_process.Start();
  12. child_process.WaitForInputIdle(); //prima di inviare qualsiasi input sarebbe bene chiamare questa funzione, accetta anche un timeout
  13. //input
  14. child_process.StandardInput.WriteLine("ciao!");
  15. //output
  16. var response = child_process.StandardOutput.ReadLine();
  17. //ecc..
  18. 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
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 18:18
Martedì, 13/08/2013
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?

PM Quote
Avatar
GN (Member)
Guru


Messaggi: 772
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 18:55
Martedì, 13/08/2013
La proprietà StandardOutput è un normale flusso, quindi ci sono vari metodi per leggerlo; se ti basta ottenere l'output quando il processo è finito, puoi usare readToEnd(), mentre se hai bisogno di ottenerlo in tempo reale c'è un tutorial qui http://go4answers.webhost4life.com/Example/redirecting-std ...

Edit: ho trovato una discussione interessante qui http://stackoverflow.com/questions/2623028/redirect-and-pa ...

Ultima modifica effettuata da GN il 13/08/2013 alle 18:57
PM Quote
Avatar
Qwertj (Dev Team)
Guru


Messaggi: 678
Iscritto: 30/05/2011

Segnala al moderatore
Postato alle 22:41
Martedì, 13/08/2013
Come se leggessi da console, non cambia nulla

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 16:55
Mercoledì, 14/08/2013
Molto gentili :)
Ho optato per questa questa metodologia
Codice sorgente - presumibilmente C++

  1. static void Main(string[] args)
  2.         {
  3.             Process child = new Process();
  4.             child.StartInfo.Arguments = Console.ReadLine();
  5.             child.StartInfo.RedirectStandardOutput = true;
  6.             child.StartInfo.RedirectStandardInput = true;
  7.             child.StartInfo.UseShellExecute = false;
  8.             child.StartInfo.CreateNoWindow = true;//Necessario solo nei form
  9.             child.OutputDataReceived += new DataReceivedEventHandler(childOutputHandler);
  10.             child.StartInfo.FileName = "Child.exe";
  11.             child.Start();
  12.             child.BeginOutputReadLine();
  13.             child.WaitForExit();
  14.             Console.ReadLine();
  15.         }
  16.  
  17.         private static void childOutputHandler(object sender, DataReceivedEventArgs e)
  18.         {
  19.             if (e.Data != null) Console.WriteLine(e.Data);
  20.         }


Però vorrei un po approfondire, se invece mi occupassi di un form come processo figlio? come invio l'output?

PM Quote
Avatar
Qwertj (Dev Team)
Guru


Messaggi: 678
Iscritto: 30/05/2011

Segnala al moderatore
Postato alle 21:34
Giovedì, 15/08/2013
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

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1170
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 21:46
Venerdì, 16/08/2013
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?

PM Quote
Avatar
GN (Member)
Guru


Messaggi: 772
Iscritto: 30/04/2011

Segnala al moderatore
Postato alle 13:45
Sabato, 17/08/2013
Testo quotato

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.

Testo quotato

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

  1. child.StartInfo.RedirectStandardOutput
  2. child.StartInfo.RedirectStandardInput


PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo