Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. 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: 1127
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?


La programmazione è arte... fa che i tuoi script siano degni di un museo.
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


Blog:
<coming soon>
Appalo:
http://www.appalo.it/
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
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?


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote
Avatar
GN (Member)
Guru


Messaggi: 770
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


Blog:
<coming soon>
Appalo:
http://www.appalo.it/
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
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?


La programmazione è arte... fa che i tuoi script siano degni di un museo.
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


Blog:
<coming soon>
Appalo:
http://www.appalo.it/
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
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?


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote
Avatar
GN (Member)
Guru


Messaggi: 770
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