PDA

Ver la Versión Completa : Ejecutar un fichero en msdos y ver en un progress el tiempo de ejecucion


juank1971
27-08-2013, 22:50:51
Hola amigos:
Estoy haciendo una aplicacion como una especie de saco que grava casi todo lo que necesito de electrónica generalmente son Datasheet que son PDF, la mayoría, y algunos ficheros de otro tipo, el final es todo metido a una base de sqlite3, todo funciona bien, los guardo en un campo blob.

Los tengo organizados y todo funciona bien , los saco o cosulto cuando quiero y todo organizado por categoría, Ahora bien:
A la hora de hacer busquedas se me ocurrio antes de entrar los pdf a la base de datos sqlite, los convierto a texto, y guardo el texto en un campo entonces las busquedas se hacen en sqlite rapido y puedes hacer una busqueda de todos los miles de pdf dentro de cada documento, algo que en windows no se puede hacer rapido , buscar dentro de pdf.

Pero el problema lo tengo en la forma que hago es en un programa sugerido por ustedes en otro hilo esta linea de comandos msdos:

pdftotext -raw biblia delphi.pdf prueba.txt

con eso optengo un texto con lo que necesito y luego lo guardo a la base de datos, tienen alguna idea de como puedo hacer eso y saber con un progress un aproximado del tiempo para que el usuario no tenga que esperar sin ver nada en ese indexado previo a guardar el archivo pdf???

gracias juank

Ñuño Martínez
29-08-2013, 02:56:03
Macho, me está costando mucho leerte. Yo de ti revisaría las comas y, posiblemente, las tildes. A ver si mañana por la mañana, después de dormir, me entero de algo.

juank1971
30-08-2013, 15:21:26
Tienes razon, siempre escribo apurado y trato de explicar tanto que me pierdo en explicaciones, es simple:

Una idea para ejecutar un TProgress ejecutando un programa en msdos, en este caso es el PDFtoText.exe, o sea ejecutar algo en dos y que el usuario no se me duerma esperando que vea al menos un aproximado de que tiempo le falta.

Gracias Juank

ecfisa
30-08-2013, 21:54:23
Hola juank1971.

No conozco ni he usado el PDFtoText, pero fijate si te sirve de este modo (o al menos te da alguna idea para continuar) :

...
uses ShellApi;

var
ProcHandle : THandle = 0;

procedure TForm1.FormCreate(Sender: TObject);
begin
Timer1.Enabled := False;
end;

procedure TForm1.ExecWithProgressBar(const AppName, Params: string);
var
ExecInfo: TShellExecuteInfo;
begin
ZeroMemory(@ExecInfo, SizeOf(ExecInfo));
with ExecInfo do
begin
cbSize := SizeOf(ExecInfo);
fMask := SEE_MASK_NOCLOSEPROCESS;
Wnd := ProcHandle;
lpVerb := 'open';
lpFile := PChar(AppName);
lpParameters := PChar(Params);
nShow := SW_HIDE;
end;
if not ShellExecuteEx(@ExecInfo) then
MessageBox(Handle,PChar(SysErrorMessage(GetLastError)),'',MB_ICONERROR+MB_OK)
else
begin
ProcHandle := ExecInfo.hProcess;
Timer1.Enabled := True;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var
ExitCode: DWORD;
begin
ProgressBar1.StepIt;
if GetExitCodeProcess(ProcHandle, ExitCode) then
begin
if not (ExitCode = STILL_ACTIVE) then
begin
CloseHandle(ProcHandle);
ProcHandle := 0;
end
else
MessageBox(Handle,PChar(SysErrorMessage(GetLastError)),'',MB_ICONERROR+MB_OK);
Timer1.Enabled := False;
end;
end;
...



Ejemplo de llamada (imprimir un documento .pdf con PDFCreator):

procedure TForm1.Button1Click(Sender: TObject);
begin
ExecWithProgressBar('C:\Program Files\PDFCreator\PDFCreator.exe',
'/NoStart/PFC:\Users\xxxx\Documents\Un_Documento.pdf');


Saludos :)

juank1971
31-08-2013, 15:41:41
ok gracias amigo pero desde que se ejecuta el timer la primera vez ya el
ExitCode es igual al STILL_ACTIVE y me salta para el else y me muestra un mensaje de todo correcto.
estoy mirando a ver porque me da eso.

procedure TForm1.Timer1Timer(Sender: TObject);
var ExitCode: DWORD;
begin
ProgressBar1.StepIt;
if GetExitCodeProcess(ProcHandle, ExitCode) then
begin
if not (ExitCode = STILL_ACTIVE) then
begin
CloseHandle(ProcHandle);
ProcHandle := 0;
end
else
MessageBox(Handle,PChar(SysErrorMessage(GetLastError)),'',MB_ICONERROR+MB_OK); //salta para esta linea desde la primea vez,
// y elfichero que estoy ejecutando en msdos es bastante largo se demora ejecutando
Timer1.Enabled := False;
end;
end;

ecfisa
31-08-2013, 17:43:43
Hola

Proba de este modo:

procedure TForm1.Timer1Timer(Sender: TObject);
var
ExitCode: DWORD;
begin
ProgressBar1.StepIt;
if GetExitCodeProcess(ProcHandle, ExitCode) then
begin
if not (ExitCode = STILL_ACTIVE) then
begin
CloseHandle(ProcHandle);
ProcHandle := 0;
end;
Timer1.Enabled := False;
end;
end;


Saludos. :)

juank1971
31-08-2013, 23:36:45
ok gracias