Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

Pristup konzolnoj aplikaciji iz .net windows aplikacije

  • 11 odgovora
  • 4.090 pregleda

Najnovija ↓

Pristup konzolnoj aplikaciji iz .net windows aplikacije 27.04.2008. u 15:25 · pre 225 meseci #1
Ovako, razvijam GUI za šah i želio bih integrirati neki od open source engina, radi analiza pozicija, treniranja i sl.Za oko mi je zapeo moćan open source engine Crafty, koji se u biti vrti kao konzolna aplikacija i taj engine se na sve nemoguće i moguće načine može podesiti i iskoristiti iz konzole. Ja bih želio taj engine pokrenuti kao proces iz koda(C#), tj. iz Windows aplikacije i upravljati odande njime razmjenom stringova, tj. trebao bih poslati string u njegovu konzolu i trebao bih imati mogućnost string koji on vrati kao odgovor dohvatiti iz svoje Win. aplikacije.Neki ljudi su mi preporučili anonymous pipes komunikaciju, ali mi na žalost nisu znali objasniti konkretnije kako tu komunikaciju ostvariti.Tražio sam po MSDN-u , uspio sam dobiti da mi se string pojavi u konzoli od engine-a ali to je i sve, nijednu naredbu engine-a nisam uspio pokrenuti iz Win aplikacije.Zna li neko kako riješiti taj problem?
Re: Pristup konzolnoj aplikaciji iz .net windows aplikacije 27.04.2008. u 22:08 · pre 225 meseci #2
Baš i ja radim nešto slično
Code:
using System;
using System.IO;
using System.Diagnostics;

class Program
{
    static void Main ( string [] args )
    {
        ProcessStartInfo pi = new ProcessStartInfo ( "aaa.exe", "ovdje dođu argumenti" );
        pi.WindowStyle = ProcessWindowStyle.Hidden;
        pi.RedirectStandardOutput = true;
        pi.UseShellExecute = false;
        Process p = Process.Start ( pi );
        p.WaitForExit ();
        p.Start ();
        TextReader t = p.StandardOutput;
        string s;
        s = t.ReadToEnd () ;
        Console.WriteLine ( s );
    }
}

Uglavnom aplikacija radi kad čita i piše tekst ali ako naiđe na console.ReadLIne () onada nevalja
Re: Pristup konzolnoj aplikaciji iz .net windows aplikacije 27.04.2008. u 22:08 · pre 225 meseci #3
using System;
using System.IO;
using System.Diagnostics;

class Program
{
static void Main ( string [] args )
{
Process p = new Process ();
String s;
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "gnugo.exe";
p.StartInfo.Arguments = "--mode gtp";
p.Start ();
StreamReader reader = p.StandardOutput;
StreamWriter writer = p.StandardInput;
writer.AutoFlush = true;
writer.WriteLine ( "1 boardsize 7" );
s = reader.ReadToEnd ();
Console.WriteLine ( s );
}
}
Re: Pristup konzolnoj aplikaciji iz .net windows aplikacije 28.04.2008. u 09:08 · pre 225 meseci #6
Tebi se dešava da ti se ništa ne prikazuje zbog praznih linija i nailaženja na Console.ReadLIne() odnosno scanf () u Crafty enginu. malo se igraj pa ćeš vidit
Code:
using System;
using System.IO;
using System.Diagnostics;

class Program
{
    static void Main ( string [] args )
    {
        Process p = new Process ();
        string s;
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardInput = true;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.FileName = "Crafty.exe";//stavi Crafty.exe u direktorij di ti je program
        p.Start ();
        StreamReader reader = p.StandardOutput;
        StreamWriter writer = p.StandardInput;
        writer.AutoFlush = true;
        s = reader.ReadLine ();
        while ( ( s = reader.ReadLine() ) != "" )
        {
            Console.WriteLine ( s );
        }
        s = reader.ReadLine ();
        s = reader.ReadLine ();
        writer.WriteLine ( "blabal" );
        s = reader.ReadLine ();
        Console.WriteLine ( s );
    }
}
Re: Pristup konzolnoj aplikaciji iz .net windows aplikacije 28.04.2008. u 16:40 · pre 225 meseci #8
Naišo sam na jedan čudan slučaj, čini mi se da je bug u pitanju: Kada pomoću StreamReadera i metode ReadLine() učitavam red po red sa streama, (Crafty engine) jedno vrijeme sve radi dobro , tj. tako dugo dok ne učita početnu poruku enginea, a zatim program jednostavno zablokira na pozivu metode reader.ReadLine().
Probao sam pokušati iz Debuggera, no stvar je ista, nije bitno da li izlaz smjestim u neku varijablu npr. s = reader.ReadLine() ili samo na ključnoj liniji pozovem reader.ReadLine(), stvar je ista, program zablokira bez ikakvog upozorenja.Jesi li imao sličan problem?Ista stvar se dogadj i u onom primjeru koji si poslao ovdje, provjeri.
Re: Pristup konzolnoj aplikaciji iz .net windows aplikacije 28.04.2008. u 16:54 · pre 225 meseci #9
Misliš program stoji, a karet ( text kursor ) žmiga? To je zato što program čita dok ne naiđe na Console.ReadLine () odnosno scanf() ( valjda je crafty pisan u c-u ). Zato sam ti rekao da ne koristiš ReadToEnd ( to čita sve do kraja) već Console.ReadLine(). Dakle liniju po liniju. Moraš znati kad dolazi linija scanf(). Nju ne smiješ čitati jer će ti se program zablokirat na njoj. Dakle čitaš linjiu po liniju, a kad dođe scanf() onda sa writer.writLine( upišeš tekst). Pa opet onoliku Readline-ova koliko će biti outputa.

C:\ Ovo je 1. output
C:\ Ovo je 2. output
C:\ Ovo je 3. output
C:\
C:\ Ovo je 4. output
C:\ Ovo je 5. output
C:\ Ovo je 6. output

Readline ()
Readline ()
Readline ()
WriteLine()
Readline ()
Readline ()
Readline ()
Re: Pristup konzolnoj aplikaciji iz .net windows aplikacije 28.04.2008. u 17:22 · pre 225 meseci #11
Recimo ovaj kod upiše 100 različitih naredbi i dobije 100 različitih odgovora, ne zablokira nikad ( P.S. ispiše do 90 jer prvih 10 probadne na intro ( Crafty poruke kad se inicijalizira). Pošalji mi točne naredbe, da probam sa njima.
Code:
class Program
{
    static void Main ( string [] args )
    {
        Process p = new Process ();
        string s;
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.RedirectStandardInput = true;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.FileName = "Crafty.exe";
        p.Start ();
        StreamReader reader = p.StandardOutput;
        StreamWriter writer = p.StandardInput;
        writer.AutoFlush = true;
        int a = 0;
        while ( a < 100 )
        {
            writer.WriteLine ( a );
            s = reader.ReadLine ();
            Console.WriteLine ( s );
            a++;
        }
    }
}
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme