Italian community of Lazarus and Free Pascal

Programmazione => Generale => Topic aperto da: sekoto - Marzo 21, 2020, 12:46:27 pm

Titolo: Avviare 2 TProcess nella stessa procedura
Inserito da: sekoto - Marzo 21, 2020, 12:46:27 pm
Buongiornosono sempre io a rompere le scatole con domande o problemi a volte banali.
Ho bisogno di eseguire due TProcess nella stessa procedura ma purtoppo Windows mi da un errore (non ricordo bene ma dovrebbe essere access violation).
Di seguito metto una bozza del codice così per vedere se riuscite a capire il mio errore.
Codice: [Seleziona]
procedure xyz
var AProcess, AProcess1: TProcess;
begin
  AProcess.Create(nil);
  AProcess.Executable:= 'file da avviare';
  AProcess.Options := AProcess.Options + [poWaitOnExit];
  AProcess.Execute;
  AProcess.free;
  AProcess1.Create(nil);
  AProcess1.Executable:= 'file da avviare';
  AProcess1.Options := AProcess.Options + [poWaitOnExit];
  AProcess1.Execute;
  AProcess1.free;

Il primo TProcess viene eseguito senza errori mentre il secondo mi da errore.
Da notare che potrei usare OpenDocument('xxx') ma con questa funzione non so quando il programma esterno finisce cosa invece che posso controllare con TProcess.
Grazie mille a tutti.
Titolo: Re:Avviare 2 TProcess nella stessa procedura
Inserito da: bonmario - Marzo 21, 2020, 04:28:07 pm
Allora, a meno che sia per un "compito" o cose del genere, ti conviene cambiare approccio:
 - fai una procedura che riceve in input il comando da avviare, ed eventualmente i parametri del comando (in futuro sicuramente ti tornerà utile)
 - chiami questa procedura 2 volte con i 2 comandi

Detto questo, il codice sembra identico nei 2 lanci, quindi mi viene da dire che il secondo lancio ha la stringa sbagliata o cose del genere.
Purtroppo, senza il "codice reale" ed i dettagli, è difficile darti una risposta valida.

Ciao, Mario
Titolo: Re:Avviare 2 TProcess nella stessa procedura
Inserito da: Stilgar - Marzo 21, 2020, 05:00:24 pm
Codice: [Seleziona]
AProcess1.Options := AProcess.Options + [poWaitOnExit];

Liberi l'istanza e poi la usi.

Credo sia quello il problema :)

Stilgar
Titolo: Re:Avviare 2 TProcess nella stessa procedura
Inserito da: sekoto - Marzo 21, 2020, 05:07:59 pm
Codice: [Seleziona]
AProcess1.Options := AProcess.Options + [poWaitOnExit];

Liberi l'istanza e poi la usi.

Credo sia quello il problema :)

Stilgar

Non ho capito in che senso, comunque a me serve proprio quest'istanza perchè se non termina il programma esterno il programma non deve continuare
Titolo: Re:Avviare 2 TProcess nella stessa procedura
Inserito da: sekoto - Marzo 21, 2020, 05:08:18 pm
Allora, a meno che sia per un "compito" o cose del genere, ti conviene cambiare approccio:
 - fai una procedura che riceve in input il comando da avviare, ed eventualmente i parametri del comando (in futuro sicuramente ti tornerà utile)
 - chiami questa procedura 2 volte con i 2 comandi

Detto questo, il codice sembra identico nei 2 lanci, quindi mi viene da dire che il secondo lancio ha la stringa sbagliata o cose del genere.
Purtroppo, senza il "codice reale" ed i dettagli, è difficile darti una risposta valida.

Ciao, Mario

questo è il codice reale:
Codice: [Seleziona]
var AProcess, AProcess1: TProcess;
    Memo: TMemo;
    Directory: String;
    ListBox1: TListbox;
begin
   ListBox1 :=TListBox.Create(self);
   directory := ExtractFilepath(Application.ExeName);
   Memo := TMemo.Create(self);
   Memo.Lines.Add('curl -L -O https://www.python.org/ftp/python/3.8.2/python-3.8.2.exe');
   Memo.Lines.SaveToFile(directory +'/PythonEsptool.bat');
   AProcess :=TProcess.Create(nil);
   AProcess.Executable:='PythonEsptool.bat';
   AProcess.Options := AProcess.Options + [poWaitOnExit];
   AProcess.Execute;
   AProcess.Free;
   FindFiles(directory +'py*.exe',faAnyFile,ListBox1.Items);
   AProcess1 :=TProcess.Create(nil);
   AProcess1.Executable:=directory + Listbox1.Items.Strings[0];
   AProcess1.Options := AProcess.Options + [poWaitOnExit];
   AProcess1.Execute;
   AProcess1.Free;
   //OpenDocument(directory + Listbox1.Items.Strings[0]);
end;                         

da premettere che OpenDocument funziona perfettamente.

per quanto riguarda la procedure penso sia la stessa cosa
Titolo: Re:Avviare 2 TProcess nella stessa procedura
Inserito da: bonmario - Marzo 21, 2020, 05:14:35 pm
Prima di questa riga:
Codice: [Seleziona]
AProcess1.Executable:=directory + Listbox1.Items.Strings[0];
Salvati il valore di "directory + Listbox1.Items.Strings[0]" in una stringa.
Mettiti in debug, e verifica che il contenuto di quella stringa sia quello che veramente ti aspetti.

Ciao, Mario
Titolo: Re:Avviare 2 TProcess nella stessa procedura
Inserito da: sekoto - Marzo 21, 2020, 05:19:00 pm
Prima di questa riga:
Codice: [Seleziona]
AProcess1.Executable:=directory + Listbox1.Items.Strings[0];
Salvati il valore di "directory + Listbox1.Items.Strings[0]" in una stringa.
Mettiti in debug, e verifica che il contenuto di quella stringa sia quello che veramente ti aspetti.

Ciao, Mario

la stringa è giusta perchè come ho scritto OpenDocument non da nessun errore quindi il problema è TProcess ma non so perchè
Titolo: Re:Avviare 2 TProcess nella stessa procedura
Inserito da: Stilgar - Marzo 21, 2020, 06:37:15 pm
Codice: [Seleziona]
var AProcess, AProcess1: TProcess;     

Memo: TMemo;     Directory: String;     ListBox1: TListbox;

begin   

ListBox1 :=TListBox.Create(self);   

  directory := ExtractFilepath(Application.ExeName);   

Memo := TMemo.Create(self);   

Memo.Lines.Add('curl -L -O https://www.python.org/ftp/python/3.8.2/python-3.8.2.exe');   

Memo.Lines.SaveToFile(directory +'/PythonEsptool.bat');   

AProcess :=TProcess.Create(nil);   

AProcess.Executable:='PythonEsptool.bat';   

AProcess.Options := AProcess.Options + [poWaitOnExit];   

AProcess.Execute;   

AProcess.Free;  <--------------------------------------------------------------------------------- Distruggi l'istanza   

FindFiles(directory +'py*.exe',faAnyFile,ListBox1.Items);   

AProcess1 :=TProcess.Create(nil);   

AProcess1.Executable:=directory + Listbox1.Items.Strings[0];   

AProcess1.Options := AProcess.Options + [poWaitOnExit]; <----------------------------------------- Usi l'istanza "Process" impostando "Process1"   

AProcess1.Execute;   

AProcess1.Free;   

 //OpenDocument(directory + Listbox1.Items.Strings[0]); end;   

 
Titolo: Re:Avviare 2 TProcess nella stessa procedura
Inserito da: sekoto - Marzo 21, 2020, 06:50:49 pm
Codice: [Seleziona]
var AProcess, AProcess1: TProcess;     

Memo: TMemo;     Directory: String;     ListBox1: TListbox;

begin   

ListBox1 :=TListBox.Create(self);   

  directory := ExtractFilepath(Application.ExeName);   

Memo := TMemo.Create(self);   

Memo.Lines.Add('curl -L -O https://www.python.org/ftp/python/3.8.2/python-3.8.2.exe');   

Memo.Lines.SaveToFile(directory +'/PythonEsptool.bat');   

AProcess :=TProcess.Create(nil);   

AProcess.Executable:='PythonEsptool.bat';   

AProcess.Options := AProcess.Options + [poWaitOnExit];   

AProcess.Execute;   

AProcess.Free;  <--------------------------------------------------------------------------------- Distruggi l'istanza   

FindFiles(directory +'py*.exe',faAnyFile,ListBox1.Items);   

AProcess1 :=TProcess.Create(nil);   

AProcess1.Executable:=directory + Listbox1.Items.Strings[0];   

AProcess1.Options := AProcess.Options + [poWaitOnExit]; <----------------------------------------- Usi l'istanza "Process" impostando "Process1"   

AProcess1.Execute;   

AProcess1.Free;   

 //OpenDocument(directory + Listbox1.Items.Strings[0]); end;   

 

Il tuo codice funziona benissimo ma non capisco la differenza tra il mio e il tuo, anche io distruggevo l'istanza, comunque grazie mille
Titolo: Re:Avviare 2 TProcess nella stessa procedura
Inserito da: bonmario - Marzo 21, 2020, 07:45:00 pm
Trovato l'errore:
Codice: [Seleziona]
AProcess1.Options := AProcess.Options + [poWaitOnExit];

In Aprocess1, impostavi AProcess.Options.

Comunque, come ti dicevo nella prima risposta, in questi casi, fai una procedura e chiamala 2 volte, risparmi tempo.

Ciao, Mario
Titolo: Re:Avviare 2 TProcess nella stessa procedura
Inserito da: sekoto - Marzo 23, 2020, 02:51:28 pm
Ho ricontrollato il codice che ho postato sul forum ed ho usato AProcess1 e non AProcess, quindi non capisco ancora l'errore. Comunque non insisto e credo che hai pienamente ragione tu... grazie ancora per il tuo aiuto
Titolo: Re:Avviare 2 TProcess nella stessa procedura
Inserito da: Stilgar - Marzo 23, 2020, 02:54:32 pm
Ciao Sekoto.
Ci riprovo l'ultima volta.
Hai usato AProcess in lettura dopo averlo distrutto. "AProcess.Free" quello fa.
Poi leggi un oggetto distrutto e ti va tutto a putt...ne.
 :)
AProcess1.Options := AProcess.Options + [poWaitOnExit];

AProcess1.Options := AProcess1.Options + [poWaitOnExit];

:)
Stilgar
Titolo: Re:Avviare 2 TProcess nella stessa procedura
Inserito da: sekoto - Marzo 23, 2020, 03:01:59 pm
ora la tua risposta ha un senso logico ma ho esaminato il codice da te postato e dice tutt'altro

Codice: [Seleziona]
AProcess1.Executable:=directory + Listbox1.Items.Strings[0];    

AProcess1.Options := AProcess.Options + [poWaitOnExit]; <----------------------------------------- Usi l'istanza "Process" impostando "Process1"   

AProcess1.Execute;   

AProcess1.Free;   

come puoi notare nell'assegnazione di AProcess1.Option tu assegni AProcess.Option ...

Comunque sia grazie per avermi risposto e scusa per la perdita di tempo
Titolo: Re:Avviare 2 TProcess nella stessa procedura
Inserito da: Stilgar - Marzo 23, 2020, 03:03:01 pm
o.O
Stavo segnando gli errori ....