Avatar billede Slettet bruger
20. oktober 2008 - 20:52 Der er 30 kommentarer og
1 løsning

Behandle tekst returneret ved anvendelse af programmer som i CMD

Hej eksperter,

Hvordan kan jeg anvende teksten returneret af programmer som f.eks. CMD udskriver data fra ipconfig.exe, ping.exe, format.exe osv. i prompten? Jeg tænker primært på at udskrive resultatet af et kald til Valves compiler-tools til TextFields på en Form.
PS: Har fænomenet (at programmer returnerer tekst eller anvendelsen af denne) et navn?
Avatar billede arne_v Ekspert
20. oktober 2008 - 21:01 #1
Process.Start giver dig mulighed for at laese output fra programmet.
Avatar billede arne_v Ekspert
20. oktober 2008 - 21:03 #2
Eksempel:

            ProcessStartInfo psi = new ProcessStartInfo();
            psi.FileName = "ping";
            psi.Arguments = "192.168.0." + no;
            psi.CreateNoWindow = true;
            psi.UseShellExecute = false;
            psi.RedirectStandardOutput = true;
            Process p = Process.Start(psi);
            StreamReader sr = p.StandardOutput;
            string line;
            while((line = sr.ReadLine()) != null)
            {
                res += line;
            }
            sr.Close();
            p.Close();
        }
        public string Res
        {
            get
            {
                return res;
            }
        }
Avatar billede Slettet bruger
20. oktober 2008 - 23:02 #3
Mange tak :)
Jeg skriver snarest tilbage.
Avatar billede Slettet bruger
20. oktober 2008 - 23:25 #4
Jeg har lige et andet (kort) spørgsmål, om jeg må stille det her...
Jeg får denne fejl, når jeg forsøger at redigere i registreringsdatabasen:
'Der kan ikke skrives til registreringsdatabasenøglen'
Hvad skyldes dette, og hvordan undgår jeg problemet?

Jeg skal have de grundlæggende ting ved min applikation til at fungere, inden jeg kan implementere brugen af kommunikation med de eksterne processer.
Avatar billede Slettet bruger
20. oktober 2008 - 23:27 #5
Problem løst!
Jeg skulle bare angive, at jeg også ville have write-rettigheder.
Jeg vender frygteligt tilbage, når jeg er klar til at implementere det sidste (nok i morgen).
Avatar billede Slettet bruger
21. oktober 2008 - 19:42 #6
Det ser godt nok enkelt ud! Jeg bliver hele tiden overrasket over, hvor godt C# er udført.
Anyway: Hvad gør jeg, hvis det kaldte program afvikles MEGET langsomt? Jeg vil nemlig IKKE have, at "værtsprogrammet" (det jeg skriver) ikke svarer og kun opdateres, når det modtager input. Kan jeg lave en form for pauser mellem indlæsning af data fra det kaldte program?
Avatar billede arne_v Ekspert
21. oktober 2008 - 19:52 #7
Saa skal du koere det i en separat traad.
Avatar billede Slettet bruger
21. oktober 2008 - 19:56 #8
Og bliver det avanceret?
Avatar billede arne_v Ekspert
21. oktober 2008 - 20:02 #9
Ikke noedvendigvis.

Bare koer det i en traad. Eneste trick er at den traad skal opdatere GUI med Invoke.
Avatar billede Slettet bruger
21. oktober 2008 - 20:11 #10
Okay, så spørger jeg på en anden måde:
Er det omstændigt, når jeg *ALDRIG* har hverken arbejdet med eller læst om brugen af tråde?
Avatar billede arne_v Ekspert
21. oktober 2008 - 20:44 #11
Jeg kunne proeve at lave et eksempel.
Avatar billede Slettet bruger
21. oktober 2008 - 21:08 #12
Det ville være skønt!
Bemærk forresten at jeg anvender Visual C# *EXPRESS EDITION* 2008 - hvormed nogle features kan være utilgængelige.
Avatar billede arne_v Ekspert
22. oktober 2008 - 01:10 #13
Et eksempel paa en thread som opdaterer en label i en GUI:

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;

public class MainForm : Form
{
    private Label time;
    private Button start;
    private Button abort;
    private Thread t;
   
    public MainForm()
    {
        time = new Label();
        start = new Button();
        abort = new Button();
        SuspendLayout();
        time.Location = new Point(50, 50);
        time.Size = new Size(300, 50);
        time.Font = new Font(FontFamily.GenericSerif, 16.0f);
        start.Location = new Point(50,150);
        start.Size = new Size(200, 50);
        start.Name = "Start Button";
        start.Text = "Start clock";
        start.Click += new EventHandler(StartClick);
        abort.Location = new Point(50,250);
        abort.Size = new Size(200, 50);
        abort.Name = "Abort Button";
        abort.Text = "Abort clock";
        abort.Click += new EventHandler(AbortClick);
        ClientSize = new Size(400, 350);
        Controls.Add(time);
        Controls.Add(start);
        Controls.Add(abort);
        Name = "Main Form";
        Text = "Main Form";
        ResumeLayout(false);
    }
    public void UpdateTime()
    {
        time.Text = DateTime.Now.ToString();
    }
    public delegate void UpdateTimeHandler();
    public void Run()
    {
        while(true)
        {
            if(time.InvokeRequired)
            {
                time.Invoke(new UpdateTimeHandler(UpdateTime));
            }
            else
            {
                Update();
            }
            Thread.Sleep(1000);
        }
    }
    public void StartClick(object sender, EventArgs e)
    {
        t = new Thread(new ThreadStart(Run));
        t.Start();
    }
    public void AbortClick(object sender, EventArgs e)
    {
        t.Abort();         
    }
    [STAThread]
    public static void Main(string[] args)
    {
        Application.Run(new MainForm());
        Application.Exit();
        Environment.Exit(0);
    }
}
Avatar billede Slettet bruger
22. oktober 2008 - 09:29 #14
Mange tak :)
Men hvordan får jeg min nye tråd til at afvikle programmet og hele tiden modtage input, så det kan sendes videre uden spring?
Avatar billede arne_v Ekspert
22. oktober 2008 - 09:39 #15
Du putter Process.Start og laese loekken ind i Run og kalder saa Invoke derinde fra.
Avatar billede arne_v Ekspert
22. oktober 2008 - 09:39 #16
Jeg kan ioevrigt se at der er en fejl i min kode:

            else
            {
                UpdateTime();
            }
Avatar billede Slettet bruger
22. oktober 2008 - 12:51 #17
Tak!
Hvad sker der med den nye tråd, hvis jeg terminerer den oprindelige process? Og hvad sker der med det kaldte program? Og hvad sker der, hvis jeg terminerer det kaldte program før min applikation?
Avatar billede arne_v Ekspert
22. oktober 2008 - 13:11 #18
Lidt afhaengig af hvordan du lukker vil du lukke alle traade eller vente til alle
traade er afsluttet.

Det andet program er en ekstern process og vil koere videre, men kan faa fejl paa
at skrive output.
Avatar billede Slettet bruger
22. oktober 2008 - 13:25 #19
Fint!
Mange tak for hjælpen - jeg skriver lidt.
Avatar billede Slettet bruger
22. oktober 2008 - 13:54 #20
Okay... Det virkede vist i første forsøg!
Her er koden:


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

using System.Diagnostics;
using System.IO;
using System.Threading;

namespace OSC
{
    public partial class Form_Log : Form
    {
        private String Log = "";
        private Thread CompilerThread;
        private delegate void UpdateLogHandler();

        public Form_Log()
        {
            InitializeComponent();
            CompilerThread = new Thread(new ThreadStart(CompilerLoop));
            CompilerThread.Start();
        }

        private void UpdateLog()
        {
            TextBox_Log.Text = Log;
        }

        private void CompilerLoop()
        {
            ProcessStartInfo CompilerProcessInfo = new ProcessStartInfo();
            CompilerProcessInfo.FileName = "ping";
            CompilerProcessInfo.Arguments = "google.com";
            CompilerProcessInfo.CreateNoWindow = true;
            CompilerProcessInfo.UseShellExecute = false;
            CompilerProcessInfo.RedirectStandardOutput = true;
            Process CompilerProcess = Process.Start(CompilerProcessInfo);
            StreamReader Reader = CompilerProcess.StandardOutput;
            String line;
            while ((line = Reader.ReadLine()) != null)
            {
                Log += line;
                if (TextBox_Log.InvokeRequired)
                {
                    TextBox_Log.Invoke(new UpdateLogHandler(UpdateLog));
                }
                else
                {
                    UpdateLog();
                }
            }
            Reader.Close();
            CompilerProcess.Close();
        }

        private void TextBox_Log_TextChanged(object sender, EventArgs e)
        {
            UpdateLog();
        }

        private void Button_Log_Click(object sender, EventArgs e)
        {
            Close();
        }

        private void Form_Log_Resize(object sender, EventArgs e)
        {
            TextBox_Log.Width = Button_Log.Width = Width - 40;
            TextBox_Log.Height = Height - 89;
            Button_Log.Top = Height - 71;
        }
    }
}


Jeg har dog et problem: Outputteksten indeholder ingen linjeskift, og jeg har allerede sat min TextBox til Multline=true og AcceptsReturn=true. Hvad er der galt?
Avatar billede Slettet bruger
22. oktober 2008 - 13:55 #21
Den oprettede tråd afslutter sig selv ved enden af koden, right?
Avatar billede arne_v Ekspert
22. oktober 2008 - 13:59 #22
proev og erstat

Log += line;

med

Log += line;
Log += "\r\n";
Avatar billede arne_v Ekspert
22. oktober 2008 - 14:00 #23
Overvej ioevrigt en StringBuilder fremfor String til Log !

Ja - traaden loeber ud.
Avatar billede arne_v Ekspert
22. oktober 2008 - 14:01 #24
CompilerProcessInfo ?

Vil du kalde en compiler ? En .NET compiler ? De kan kaldes programmatisk !!
Avatar billede Slettet bruger
22. oktober 2008 - 14:10 #25
Nope, det er Valve's Source compilers - VBSP, VVIS og VRAD. Jeg er ved at skrive et compilation interface til Half-Life-serien :o)

Det virker med \r\n :) Tak igen.
Avatar billede Slettet bruger
22. oktober 2008 - 14:11 #26
... eller rettere:
\r\n giver (af hvilken årsag?) dobbelt linjeskift. \n\r giver enkelt.
Avatar billede arne_v Ekspert
22. oktober 2008 - 14:13 #27
Proev evt. med kun \n !
Avatar billede Slettet bruger
22. oktober 2008 - 19:57 #28
Jeg prøver mig lidt frem.
Avatar billede Slettet bruger
22. oktober 2008 - 22:22 #29
Jeg skulle mene at have styr på det nu :) Mange tak!
Du kan bare smide et svar.
Avatar billede arne_v Ekspert
23. oktober 2008 - 00:23 #30
kommer her
Avatar billede Slettet bruger
23. oktober 2008 - 10:06 #31
Kapow.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester