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.
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.
AProcess1.Options := AProcess.Options + [poWaitOnExit];
Liberi l'istanza e poi la usi.
Credo sia quello il problema :)
Stilgar
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:
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
Prima di questa riga:
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
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;
Trovato l'errore:
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
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
ora la tua risposta ha un senso logico ma ho esaminato il codice da te postato e dice tutt'altro
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