Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 13-06-2007
Drahcir Drahcir is offline
Miembro
 
Registrado: jul 2005
Ubicación: A Coruña
Posts: 53
Poder: 19
Drahcir Va por buen camino
Problema con WinExec.

Hola a todos,

tengo un problema al que no he encontrado solución y me trae de cabeza. El caso es que en una aplicación en Delphi5 tengo una llamada a una rutina .exe mediante un WinExec... Dicha rutina lo que hace es generar un fichero de salida, tras el WinExec realizo una parada de un segundo y abro el fichero de salida para meter los datos en un StringList (que recorro para tomar solo ciertos datos). El problema es que depende en que equipo tras la primera ejecucion de la rutina me sale el error de que no encuentra el fichero de salida (porque la rutina todavía no lo ha "soltado"), he puesto un control de que si todavía está en modo ReadOnly no siga pero nada.

Mi pregunta es la siguiente, tengo alguna forma de saber, tras hacer el WinExec como puedo saber que ha terminado la rutina para proseguir con el proceso???

Muchas gracias, saludos.
Responder Con Cita
  #2  
Antiguo 13-06-2007
loxod loxod is offline
Miembro
 
Registrado: feb 2007
Ubicación: Mexico
Posts: 45
Poder: 0
loxod Va por buen camino
checate este link te pudiera servir

http://www.q3.nu/trucomania/ftesp.html
Responder Con Cita
  #3  
Antiguo 13-06-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cool Ok

Lastimosamente esta un poco complicado utilizando la API WinExec, La forma de hacerlo es listar los procesos y comprobar cuando el que creaste es terminado. El gran problema de esto (y no digo que se pueda hacer), es que puede existir un proceso con el mismo nombre que haya sido creado con anterioridad, en ese entonces que sucedera? cómo sabras cual creaste tu? obviamente se puede! pero no me parece la forma correcta.

Te dejo un par de APIs que te serán más util:

Código Delphi [-]
var
 si: TStartupInfo = (cb: SizeOf(TStartupInfo));
 pi: TProcessInformation;
 
procedure TForm1.Button1Click(Sender: TObject);
begin
 CreateProcess(nil, 'c:\windows\system32\notepad.exe', nil, nil, False, 0, nil, nil, si, pi);
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
 if WaitForSingleObject(pi.hProcess, 0) = WAIT_OBJECT_0 then
  MessageBox(0, 'La aplicacion ha terminado, corre la siguiente!', nil, 0)
 else
  MessageBox(0, 'Todavia, espera!', nil, 0)
end;

0j0 que solo es para prueba, si no conoces la API te la explico: CreateProcess es la API que internamente utiliza el WinExec y otros. te permite un control un poco mas "avanzado" del nuevo proceso creado.

Yo pongo la estructura TStartupInfo como global pues la puedo inicializar en tiempo de diseño, si fuese local tendria que llamar a FillChar(0..., y luego a si.cb := SizeOf...
La estructura TProcessInformation es global pues debo poder saber el momento en que el nuevo proceso es liberado.

Finalmente el Button1 "corre" al Block de notas y el Button2 verifica si la aplicacion aún está en ejecucion con la API WaitForSingleObject utilizada para la sincronizacion (Mutex, Pipes, etc, etc).

Espero te sirva. Suerte!
Responder Con Cita
  #4  
Antiguo 14-06-2007
Drahcir Drahcir is offline
Miembro
 
Registrado: jul 2005
Ubicación: A Coruña
Posts: 53
Poder: 19
Drahcir Va por buen camino
Muchas gracias a ambos, tendré en cuenta vuestras aportaciones. De todas formas para salir del paso se me ha ocurrido crear un bucle a la hora de hacer el LoadFromFile del fichero de salida que es el paso que me da problemas a no existir en algunos casos (por cuestión de tiempo) dicho fichero...algo así
Código Delphi [-]
e := 1
while e = 1 do begin
  try
    begin
      TStringList.LoadFromFile('C:\TEMP\FICHERO.DAT');
      e := 2;
    end;
  except
    e := 1;
  end;
end;

No es lo que se diga elegante pero supongo que me servirá para salir del paso.

Saludos.
Responder Con Cita
  #5  
Antiguo 15-06-2007
Avatar de cHackAll
[cHackAll] cHackAll is offline
Baneado?
 
Registrado: oct 2006
Posts: 2.159
Poder: 20
cHackAll Va por buen camino
Cool Mmmm.....

Corrigeme si me equivoco, me parece que estas esperando la "presencia" de un archivo? osea que sea creado o que se pueda tener acceso?

Código Delphi [-]
 repeat Sleep($7F);
//  Application.ProcessMessages;
 until CloseHandle(CreateFile('C:\TEMP\FICHERO.DAT', GENERIC_READ, FILE_SHARE_READ + FILE_SHARE_WRITE, nil, OPEN_EXISTING, 0, 0));
 ListBox1.Items.LoadFromFile('C:\TEMP\FICHERO.DAT');

Esa es la forma que yo utilizaría en ese caso particularmente, si no utilizas un Sleep parecera que el equipo anda laburando como loco.
Si no utilizas éste procedimiento de "espera" en un hilo te aconsejo quitar el comentario (//) para que tu aplicacion no aparente estar colgada.

Es lo que buscas? suerte!
Responder Con Cita
  #6  
Antiguo 15-06-2007
Drahcir Drahcir is offline
Miembro
 
Registrado: jul 2005
Ubicación: A Coruña
Posts: 53
Poder: 19
Drahcir Va por buen camino
Efectivamente mi problema es que espero un fichero. La rutina que ejecuto con el winexec devuelve un fichero que yo tengo que cargar en un TStringLista para extraer ciertos datos....y ese es el problema ya que en ocasiones me adelanto a tomar el fichero y; o todavía no está, o no se encuentra disponible aún existiendo.

Lo que tu me indicas tiene muy buena pinta y por lo menos es más elegante que mi "bucle loco". Lo comprobaré tan pronto pueda ya que ahora mismo la aplicación ya está siendo usada por el usuario.

Muchas gracias.

Saludos.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
SaveDialog con WinExec!! lduron Varios 2 16-06-2006 16:12:07
Ayuda con WinExec La__X C++ Builder 2 03-06-2006 05:23:13
Duda con Winexec sagarmar Varios 5 11-05-2006 12:58:17
WinExec karlita_cb Varios 3 18-05-2004 20:52:21
winexec en w2000 ogorut API de Windows 2 23-06-2003 18:41:58


La franja horaria es GMT +2. Ahora son las 12:32:16.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi