BETA
Aby się zalogować, najpiew wybierz portal.
Aby się zarejestrować, najpiew wybierz portal.
Podaj słowa kluczowe
Słowa kluczowe muszą mieć co najmniej 3 sąsiadujące znaki alfanumeryczne
Pole zawiera niedozwolone znaki
GoodGame
GoodGame
23 pkt.
Nowicjusz

 
0


Witam pisze program który ma skompilowąc kod źródłowy, robie to za pomoca darmowego kompilatora w programie używam :

System.Diagnostics.ProcessStartInfo psi=
                new System.Diagnostics.ProcessStartInfo();
psi.FileName="dmc.exe";//plik kompilatora
psi.Arguments="luki.c";//plik do kompilacji
psi.WorkingDirectory="C:\Documents and Settings\Wyczes\kom";
System.Diagnostics.Process
p=System.Diagnostics.Process.Start(psi);//kompilacja i teraz jak mam
wydobyć z tego co zwraca mi kompilator ( ok lub ewentualne błedy)


Problem polega na tym ze jeżeli podczas kompilacji  beda jakies
błedy to nie wiem jak odczytać to, aby móc dalej na to zareagować??
Może mam użyć rurek (pipe) i odczytać z nich co zwróci mi aplikacja??
Ale też nie wiem jak mam to zrobić:(. Czekam na propozycje, Z góry
dzięki Luki.






User 131096
User 131096
189 pkt.
Junior
 
0


Zapoznaj się z właściwościami: RedirectStandardInput, RedirectStandardOutput, RedirectStandardError klasy System.Diagnostics.ProcessStartInfo oraz z właściwościami StandardInput, StandardOutput, StandardError klasy System.Diagnostics.Process. Odpowiednie ich połączenie (ustawienie RedirectXxx na true w obiekcie klasy ProcessStartInfo i odczyt z odpowiadającej Xxx właściwości w obiekcie klasy Process, po wykonaniu programu), powinno Ci uzyskać zamierzony efekt.
Pozdrawiam

GoodGame
GoodGame
23 pkt.
Nowicjusz
 
0


Dzięki wielki , oczywiście udało mi się to wydobyć.

Ale niestety powstał kolejny problem a mianowicie:
Skompilowałem plik, powstał plik zadanie.exe i w nim umieszczony jest
kod który powoduje ze aplikacja nigdy sie nie kończy ( jakiś while) w
jaki sposób mogę np po 30,60 zakończyć(programowo)  ten proces
który uruchomiłem nie zamykając odrazu głownej aplikacji!!?? Czy musze
ten proces uruchomić w nowym wątku?? Jak to sprawdzić i jak
zareagować???

Wyczes.

User 131096
User 131096
189 pkt.
Junior
 
0


Tak, jak sam napisałeś, proces odpalasz za pomocą:
System.Diagnostics.Process p = System.Diagnostics.Process.Start(psi);
Wystarczy odpalić po odpowiednim czasie metodę Kill na utworzonym procesie:
p.Kill();
Dodatkowo możesz podpiąc się pod różne wydarzenia klasy Process, aby odpowiednio reagować w "głównej" aplikacji, która odpala pozostałe.
W jaki sposób włączyć zegar? Zapoznaj się z System.Timers.Timer, z wydarzeniem Elapsed :). Inne klasy, które Cię mogą interesować:System.Windows.Forms.TimerSystem.Threading.Timer
To, która jest najodpowiedniejsza do użycia, musisz rozstrzygnąć sam, biorąc pod uwagę konstrukcję swojej aplikacji. Osobiście obstawiam, że System.Timers.Timer będzie dla Ciebie najwygodniejsza.
Pozdrawiam

GoodGame
GoodGame
23 pkt.
Nowicjusz
 
0


Witam.

Oki to akurat nie jest problem , tak mi się wydaję ale nie wiem jak
sprawdzić czy włączony proces nadal się wykonuje, moge pobrac ID
procesu ale jak mam sprawdzić czy jest co p.kill();
Nie wiem gdzie sprawdzić czy np, proces o danym ID nadal się wykonuje
czy może zakończył swoje działanie, a jeżeli zakończył to po jakim
czasie.

Dzięki z góry za wszelkie wskazówki. Wyczes



GoodGame
GoodGame
23 pkt.
Nowicjusz
 
0


OK super wielkie dzięki!!! Jesli chodzi o komilator C to juz wszystko
działa, kompilacja,  automatyczne zabijanie wątków jeżeli w pliku
powstanie pętla nieskończona. Dzięki



Ale niestety powstal kolejny problem i nie wiem wgóle dlaczego a
mianowicie chodzi przekierowanie standartowego wyjścia, do kompilatorka
C wszystko działa super to co zwraca mi kompilator 
porównuje sobie i analizuje(analogicznie z tym co mi zwraca póżniej
skompilowany program mogę sobie to przchytywać i analizować) i wszystko
jest super. Problem się pojawia jeżeli wrzucam kompilator Pascala :/
pal licho wszystko jest tak samo jak w C  (zmieniam nazwę pliku
który kompiluje, workdirectory, i widze sprawdzam po uruchomieniu plik
się skompilował powstał exe a w output jest pusto, jak odpalam z paska
to widze co mi kompliator napisał a stringu output nic nie ma :/ i nie
wiem dlaczego nic się tam nie znalazło skoro po skompilowaniu był
widoczny komunikat)



                psi.UseShellExecute = false;

                psi.RedirectStandardOutput = true;

           
    System.Diagnostics.Process
p=System.Diagnostics.Process.Start(psi);

                output = p.StandardOutput.ReadToEnd();

                System.Windows.Forms.MessageBox.Show(output);

                p.WaitForExit();

                output = p.StandardOutput.ReadToEnd();

                System.Windows.Forms.MessageBox.Show(output);



output niezależnie czy jest kompilacja czy  juz skompilowany kod
EXE (w którym jest jedna funkcja write('12333');)  i jak odpalam z
konsoli to napis sie pojawia i koniec a jak odpale z programu to w
output mam pusty ciag znaków,  i nie wiem dlaczego :( nie ma
przekierowania skoro identyczny kod działa jeśli chodzi o inny
kompilator. HELP



Dziwne bo program kompiluje mi plik z programu tylko nie przechwytuje tego co zwraca kompilator ... :(

User 131096
User 131096
189 pkt.
Junior
 
0


Właściwością HasExited procesu sprawdzasz czy już się zakończył. Właściwością ExitTime sprawdzasz kiedy.
Mam wrażenie, że nie korzystasz z MSDN'a. Link do wersji online: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/cpref_start.asp, w szczególności do dokumentacji klasy Process: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemdiagnosticsprocessclasstopic.asp.
Pozdrawiam

GoodGame
GoodGame
23 pkt.
Nowicjusz
 
0


Zmieniałem i wypróbowałem kilka kompilatorów i w jednym, z
nich udało mi się przechwycić zwracane wartości, ale w żadnym z nich po
skompilowaniu i utworzeniu pliku wykonawczego EXE ( jeżeli w pliku jest jedno
polecenie write('123')) i to się wypisuje na konsole, program nie przekierowywuje
tego ze standartowego wyjścia do stringa. Może ktoś wie dlaczego tak się
dzieje??? ze jak Utworze exe z programu C to wszystko działa i bez problemów
się  przekierowywuje wartości
zwracane a jak skompiluje się plik PAS to nie da rady przechwycić zwracanych
wartości przez utworzony tak plik wykonawczy EXE.


 


HELP.


User 131096
User 131096
189 pkt.
Junior
 
0


Najprawdopodobniej chodzi o to, ze programy, ktore sa kompilowane pod pascalem nie korzystaja z tych wyjsc, tylko jakos "hakersko" pisza na ekranie. Nie jestem w stanie Ci wiecej doradzic. Wiem (wroc, nie "wiem", ale "wydaje mi sie"), ze nie wszystko, co pisze na ekran korzsyta ze standardowego wyjscia, miedzy innymi biblioteki do trybu tekstowego, ktore pozwalaja na pisanie na ekranie w dowolnym punkcie ekranu.
Powodzenia w dalszych poszukiwaniach.

GoodGame
GoodGame
23 pkt.
Nowicjusz
 
0




Nie udało mi się rozwiązać problemu z Pascalem ( ale udało
mi się go ominąć) ale mam problem z JAVA a dokładnie z JDK1.5.0 której używam
do kompilowania plików, no i oczywiście co się dzieje :/ jak kompiluje z paska
to widzę ze kompilator wypisał error a jak próbuje to gdziekolwiek przekierować
to LIPA nie idzie. No i jestem w kropce bo tego kompilatora musze używać a nie
da rady wyciągnąć zwracanych danych. Dziwi mnie tom, że to co wyskoczyło w
pasku(informacja o błędzie)  jak
uruchamiam w programie to nie przechwytuje tego do stringa ale widzę to co
zwróciła aplikacja w kompilatorze w OUTPUT--> Debug :/ / Czy jest możliwe ze
może kompilator to zatrzymuje tylko dla Siebie i nie daje dalej?? W jaki sposób
to się tam dostaje bo... ja tez tak chce :). Jeżeli ma ktoś jakiś pomysł proszę
podzielcie się ze mną.

Wyczes.


GoodGame
GoodGame
23 pkt.
Nowicjusz
 
0


Pomroczność jasna!!!

Należało czytać nie ze stdout (deskryptor nr. 1), a z stderr (deskryptor nr. 2).
...
psi.RedirectStandardError = true;
...
output = p.StandardError.ReadToEnd();

GoodGame
GoodGame
23 pkt.
Nowicjusz
 
0


Co do pliku pascala tego z którego nie mogłem  przekierować wyjscia to:

Udało mi się go częściowo przekierować.
Kompilowałem za pomocą fpc
1.9.6.
Wygląda na to, że pascal poza wypisywanym
tekstem przesyła kody
sterujące do terminala,
które czyszczą ekran itd.
Po wyrzuceniu "uses
crt;" wszystko działa jak powinno.


GoodGame
GoodGame
23 pkt.
Nowicjusz
 
0


Jestem strasznie upierdliwy ale wie może ktoś jak przekierować standartowe wejście zeby program brał z pliku ?

psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardInput = true;
p=System.Diagnostics.Process.Start(psi);
....
p.StandardInput.???????????????

GoodGame
GoodGame
23 pkt.
Nowicjusz
 
0


Udało się ....


Stream stream = new FileStream( @"C:\Sprawdzaczka\test\dane.txt", FileMode.Open );
                byte[] buf = new byte[stream.Length];
                stream.Read( buf, 0, buf.Length );
                stream.Close();
                psi.UseShellExecute = false;
                psi.RedirectStandardOutput = true;
                psi.RedirectStandardInput = true;
              
 p=System.Diagnostics.Process.Start(psi);   
 //Zaczyna się proces!!!      
     
              
 p.StandardInput.BaseStream.Write( buf, 0, buf.Length );
                p.StandardInput.Close();

                this.dziala.Visible=true;
                p.WaitForExit();
                output= p.StandardOutput.ReadToEnd();

User 131096
User 131096
189 pkt.
Junior
 
0


Łukasz, za swoje posty zdobył byś nagrodę w kategorii... No właśnie - na Twój styl postowania musi być jakaś specjalna kategoria :). Może najbardziej samowystarczalnego forumowicza? ;)
Fajnie, że udało Ci się rozwiązać problem i fajnie, że podzieliłeś się rozwiązaniem.
Pozdrawiam

Udziel odpowiedzi

pkt.
Treść wpisu:

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.