Process leggere output di un programma e scriverlo a video

di il
4 risposte

Process leggere output di un programma e scriverlo a video

Salve a tutti sono nuovo nel forum e del linguaggio c#... come da titolo stavo provando a creare un semplicissimo programma che apre un'altro programma e mi scrive a video l'output ora il mio problema è che mi scrive solo una parte e poi esce senza completare il ciclo del programma aperto..... qualcuno sa dove sbaglio? vi posto il codice che ho fatto

using System;
using System.Diagnostics;

namespace ConsoleApp1
{
    class Program
    {

        //=================================================================
        //== Main
        //=================================================================
        static void Main(string[] args)
        {
            runProcess("V:\\LOCAL\\server\\map-server.exe");
            Console.WriteLine("Hello World!");
        }


        //=================================================================
        //== Start Process
        //=================================================================
        static void runProcess(string FileName)
        {
            try
            {
                var process = new Process
                {
                    StartInfo = new ProcessStartInfo
                    {
                        FileName = FileName,
                        Arguments = "V:\\",
                        UseShellExecute = false,
                        RedirectStandardOutput = true,
                        CreateNoWindow = true
                    }
                };

                process.Start();

                while (!process.StandardOutput.EndOfStream)
                {
                    var line = process.StandardOutput.ReadLine();
                    Console.WriteLine(line);
                }

                process.WaitForExit();
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
        }

    }
}

4 Risposte

  • Re: Process leggere output di un programma e scriverlo a video

    Probabilmente il programma viene eseguito velocemente e la console chiusa quando termina. Tanto velocemente che non arrivi a leggere tutto.
  • Re: Process leggere output di un programma e scriverlo a video

    No non è una qustione che si chiude subito anche perchè su vs c'è una funzione che non ti chiude la console fino a quando non premi un tasto senza modificare codice....
    ma non è quello il problema...
    facendo due test termina prima il main e poi il thread però io voglio che finisca di leggere prima tutto il programma con il thread e poi torna al main e esce... ho provato anche con t.Join() ma è come se mi legge solo le prime 4 - 5 righe e poi esce dal processo non capisco perchè.....cioè il problema e quando legge l'output del programma esterno che legge solo le prime 4 poi è come se chiude il processo....
  • Re: Process leggere output di un programma e scriverlo a video

    La ""teoria"" dice:

    1) prepari il "processo" separato da mandare in esecuzione
    2) intercetti gli "StandardOutput" e "StandardError" del processo, mediante PIPE
    3) mandi in esecuzione il PROCESSO
    4.1) cicli in attesa che il PROCESSO termini e nel frattempo leggi out/err intercettati
    OPPURE
    4.2) net thread principale dell'applicazione ATTENDI che il PROCESSO termini
    4.3) in thread separato, leggi out/err intercettati

    Il problema e' questo:

    a) NON puoi far affidamento sul fatto che gli out/err intercettati siano chiusi o no PERCHE' non sai se il processo sia partito o no
    b) NON SEI TU che fai partire il processo ANCHE se, da codice, gli hai detto di partire.
    Quello che sai PER CERTO e' che e' responsabilita' della classe usata per gestire il PROCESSO dirti SE il processo e' partito, in esecuzione o terminato.
    Lo sa lei, perche' interagisce direttamente con il SO.

    Da tutto questo si evince che
    
           process.Start();
    
           while (!process.StandardOutput.EndOfStream)
                    ...
    
    NON PUO' funzionare.

    https://docs.microsoft.com/en-us/dotnet/api/system.diagnostics.process.waitforexit?view=net-5.0

    OVVIAMENTE fare la Join su un thread locale, NON CENTRA un'acciderbolina con la gestione di un' ALTRO processo (che ha i SUOI thread).

    ANCHE per i thread locali, chiamare la "Start()" NON FA PARTIRE AUTOMATICAMENTE il thread. Semplicemente lo mette nella lista di quelli da far partire. PRIMA O POI partira'. E" la classe Thread che si occupa di gestirlo.

    SE tu chiami la Join() su un thread NON partito, la Join FUNZIONA!
    Perche' la classe Thread SA che tu ti stai mettendo in attesa del TERMINE del thread ma questo non solo non e ancora terminato, ma non e' nemmeno andato in esecuzione!

    Stessa cosa per i processi.
  • Re: Process leggere output di un programma e scriverlo a video

    Ah ok quindi devo studiare meglio i thread mi sa e provare a migliorare il codice....comunque ho midificato il codice e ora funziona mi legge tutto il programma fino alla fine e poi esce.....però non sono sicuro di aver capito bene quindi approfondirò meglio e vi faccio sapere
Devi accedere o registrarti per scrivere nel forum
4 risposte