PDA

Ver la Versión Completa : Alternativas a libc.System


ruina
23-07-2004, 11:10:32
pues bien, ya funciona todo, todo perfecto... muy bonito. Pero (siempre hay un pero) al usar Libc.system() la aplicación delphi-kylix se me queda freeze, osea, hasta que no cierre la ventana o el programa que he abierto no vuelve a funcionar el programa kylix..

Sé que tiene que haber alguna alternativa (me suena de alguna clase a la que no debi prestar mucha atención) como fork o algo asi. Pero no tengo ni idea de como puede ser....

¿algun linuxero de buen corazón por aqui cerca?

Gracias

Gydba
23-07-2004, 13:45:53
Te deja colgada la app o te tira algún error?

Es medio raro, pero lo cierto es que Kylix 3 me trajo varios problemas con las ultimas distros de linux (por ejemplo los diálogos de archivos generan un lockeo del IDE). En algunas webs dicen que al faltarle soporte para actualizar la herramienta en conjunto con el avance del kernel y los módulos de linux muchas cosas dejan de andar. Hay gente que desarrolla parches y demás, pero lo cierto es que mucho no ayudan.

Pero vemos que se puede hacer. Serviría saber que Distro de linux tenés, versión de Kylix y algún dato que nos ayude a ayudarte.

ruina
23-07-2004, 14:28:19
no, no me tira la aplicación, simplementa se queda congelado el IDE hasta que cierras la aplicación a la que has llamado (el netscape), tal y como bien has dicho: lockeo del IDE
uso k3 y ahora mismo estoy en suse 9.0, en Red Hat 7.2 no ocurre

salvica
24-07-2004, 12:03:28
A mi no se me cuelga, simplemente :mad: no hace NADA :mad: (eso si, sin mensajes de error ni nada por el estilo que me dé una pista)

Como no tengo ni idea de linux :confused: os rogaría alguna precisión al respecto
¿Hay que crear algún grupo especial para que Kylix pueda trabajar en el directorio del usuario?

Como nota os diré que instalé Kylix en Mandrake 9.2 como "root" en el directorio /usr/local/Kylix3 dando todos los permisos al usuario, grupo y resto ¿lo he hecho bien? ¿hay otra forma de hacerlo?

Por cierto, aprovecho la ocasión :), cada dos x tres pierdo el menú de Borland que Kylix crea al instalarse y al final he optado por un enlace en el escritorio.
¿Como puedo evitar este mal rollo?
Saludos y gracias adelantadas
Salvica

ruina
29-07-2004, 16:20:22
bueno, al final lo encontré: &

¡¡aleluya hermanos!!

con libc.system la aplicación espera a que se termine de ejecutar el shell de linux, todo se soluciona mediante &, que si lo pones al final de la instrucción a ejecutar intenta retornar inmediatamente, sin esperar a que termine. Ej: libc.system('konqueror /home &')
eso si, perdemos el número de error que pudiera devolver.

las otras alternativas son:
-intentar jugar con fork y execv, aunque lei en un articulo de borland que es sistema X es muy suyo cuando una aplicacion se hace un fork
-ejecutar libc.system en un thread aparte, cuando termine (si es que termina) obtendremos el valor de retorno. (hay un ejemplo muy vistoso: "kylix-app-run.zip" http://delphi.icm.edu.pl/newl/midxk10f.htm)


NOTA:
salvica, intenta ejecutar el programa SIN el debug, osea, desde linea de comandos, parece que system no se lleva muy bien con el debug de kylix.

para ello simplemente hazte un script para arrancar la aplicación:

#! /bin/sh
export LD_LIBRARY_PATH=/usr/local/kylix/bin...(donde este)

cd /usr/local/misfuentes
./miproyecto -ns

salvica
21-08-2004, 18:57:31
Gracias ruina, he comprobado que solo tengo el problema cuando ejecuto el programa en modo "shell", si lo ejecuto directamente funciona

.....
tmpDir := GetCurrentDir;
{$ifdef LINUX}
tmpCab := 'LINUX';
libC.system(PChar('echo "[LINUX]" > ' +tmpDir+'/user.ini'));
libC.system(PChar('echo "home=$HOME" >> '+tmpDir+'/user.ini'));
{$else}
tmpCab := 'WINDOWS';
UserIni := TIniFile.Create( tmpDir+'/user.ini' );
UserIni.WriteString( tmpCab, 'home', 'C:\PROGRAMAS' );
UserIni.Free;
{$endif}
UserIni := TIniFile.Create( tmpDir+'/user.ini' );
DIR_MAIN := UserIni.ReadString( tmpCab, 'home', '' );
UserIni.Free;
if( DIR_MAIN='' ) then begin
{ mensajes para aplicación no instalada }
.....
Application.Terminate;
exit;
end;
.....

Vamos que solo quiero saber donde voy a tener los directorios de trabajo de la aplicación (y ya que estoy con el Linux, pués aprender algo más)

Otra cosa :D (morro tengo) hay mucha documentación y ejemplos para evitar dos instancias del mismo programa, pero solo lo he visto para Windo$ ¿No hay nada para Linux?

Gracias adelantadas
Salvica