Exec* i prijatelji

Exec* i prijatelji

offline
  • bocke  Male
  • Moderator foruma
  • Glavni moderator Linux foruma
  • Veliki Pingvin
  • Guru
  • Pridružio: 16 Dec 2005
  • Poruke: 12518
  • Gde živiš: Južni pol

Znam da nije preporučljivo korišćenje system(komanda), ali da li postoji neko multiplatformsko rešenja za izvršavanje spoljnjeg programa u FPCu? Jako malo sam upućen u familiju Exec* komandi... Zar nisu one dostupne samo na *nix platformi? Ili grešim?

BTW, da razjasnim šta mi treba: multiplatformski način (ako je moguće) za startovanje komandnih alatki i "hvatanje" njihovog izlaza...

A pokretanje GUI alatki? Za win32 pretpostavljam da se mogu upotrebiti gore pomenute komande, ali kako sa KDE i Gnome aplikacijama?



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

http://wiki.lazarus.freepascal.org/index.php/Executing_External_Programs



offline
  • bocke  Male
  • Moderator foruma
  • Glavni moderator Linux foruma
  • Veliki Pingvin
  • Guru
  • Pridružio: 16 Dec 2005
  • Poruke: 12518
  • Gde živiš: Južni pol

I na kraju se sve svodi na RTFM. Laughing Hvala. Wink

offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

Da te samo obavestim, da onaj zadnji primer sa MemoryStreamom ne funkcionise najlepse na Windowsu, tj. ne funkcionise uopste.
Ucitace iz PIPE-a jedno 100kb, i tu ce da zablokira jer PIPE nikada nece biti ispraznjen. Nesto fali u implementaciji, a MS nije dokumentovao windows pipes bas najbolje.

Ukoliko ti eksterni program daje manje od 100kb podataka na izlazu - onda moze da prodje.
Da budem precizniji, kod mene je uvek blokiralo na 137kb.
Na Linuxu funkcionise savrseno.

Posto sam morao da napravim program koji ce da parsuje par megabajta podataka sa izlaza drugog programa, uradio sam sa IFDEF-ovima, tako da ukoliko se kompajlira na Linuxu - onda ide kao u primeru.
Ukoliko se kompajlira na Windowsu, onda moj program napravi BAT fajl (sto ce kao posledicu da startuje CMD gde pipes savrseno rade) i da preusmeri ceo izlaz programa u tekstualni log fajl. Nakon zavrsetka izvrsavanja, moj program ucita log fajl i parsuje ga.

Dopuna: 28 Mar 2006 11:39

btw. imas i drugu mogucnost:

u USES klauzuli pod IFDEF LINUX postavis LIBC, pa onda koristis komandu
libc ('ime programa') za startovanje programa pod linuxom.
Za windows iskoristis ShellExec analogno onom za linux. Problem je samo sto sada ne mogu da se setim tacnog imena unita u kome je ShellExec.

offline
  • bocke  Male
  • Moderator foruma
  • Glavni moderator Linux foruma
  • Veliki Pingvin
  • Guru
  • Pridružio: 16 Dec 2005
  • Poruke: 12518
  • Gde živiš: Južni pol

Hvala na infou. Trenutno isprobavam one jednostavnije primere. Elem, naleteo sam na mali problem, ali to bi moglo biti do Lazarus komponenti, ne FPCa... Ali kad je već postavljena tema da pitam ovde.

Napravio sam jednostavan program kako bih ovo i isprobao. Program poziva komandnu netstat i izbacuje njen sadržaj u Lazarusovu Memo kontrolu. To sve funkcioniše prvi prvom pritiskanju dugmeta. Pri svakom narednom javlja grešku:



Evo ga i kod funkcije Button1Click:
procedure TForm1.Button1Click(Sender: TObject); begin //Ovo je moj (neuspešan) pokušaj rešavanja problema: //    Memo1.Lines.Clear; //    if (AProcess.Running) then //       AProcess.Terminate(1);         AProcess.CommandLine := 'netstat --udp --tcp -p';     AProcess.Options := AProcess.Options + [poWaitOnExit, poUsePipes];     AProcess.Execute;         Memo1.Lines.LoadFromStream(AProcess.Output);     Memo1.Refresh;         AProcess.Free; end;

offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

Gde ti je AProcess.Create?

offline
  • bocke  Male
  • Moderator foruma
  • Glavni moderator Linux foruma
  • Veliki Pingvin
  • Guru
  • Pridružio: 16 Dec 2005
  • Poruke: 12518
  • Gde živiš: Južni pol

Izdvojio sam ga u:


initialization   {$I unit1.lrs}       AProcess := TProcess.Create(nil); end.

Meni tako izgleda čitljivije, a i funkcioniše.

Dopuna: 28 Mar 2006 13:01

A možda je baš u tome stvar?

offline
  • Pridružio: 04 Sep 2003
  • Poruke: 24135
  • Gde živiš: Wien

Pa ne moze, jer na kraju ButtonClick metode imas AProcess.Free i time oslobadjas proces iz memorije. Fali ti AProcess.Create kada sledeci put kliknes dugme.
Znaci, ako si uradio Free, moras opet Create da bi ponovo formirao taj proces u memoriji. Narodski receno: jedan Create => jedan Free.

offline
  • bocke  Male
  • Moderator foruma
  • Glavni moderator Linux foruma
  • Veliki Pingvin
  • Guru
  • Pridružio: 16 Dec 2005
  • Poruke: 12518
  • Gde živiš: Južni pol

U tome je bio problem. Hvala.

Dopuna: 28 Mar 2006 13:14

bobby ::Pa ne moze, jer na kraju ButtonClick metode imas AProcess.Free i time oslobadjas proces iz memorije. Fali ti AProcess.Create kada sledeci put kliknes dugme.
Znaci, ako si uradio Free, moras opet Create da bi ponovo formirao taj proces u memoriji. Narodski receno: jedan Create => jedan Free.


Da, vidim da sam spetljao malo... Sada je sve u okviru button1click i funkcioniše.

Ko je trenutno na forumu
 

Ukupno su 771 korisnika na forumu :: 5 registrovanih, 2 sakrivenih i 764 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: Bobrock1, esx66, Istman, SlaKoj, Srle993