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 31-07-2023
sEngine sEngine is offline
Miembro
 
Registrado: jul 2021
Posts: 53
Poder: 3
sEngine Va por buen camino
Error al abrir app por segunda vez

Buenos días, a ver si me podeis ayudar. Estoy teniendo un problema con delphi desde hace unas semanas. Por alguna razón me genera mal el ejecutable y a la segunda vez que inicio mi app, recibo este error.






Se que el problema no es del código de la app porque he probado a utilizar código antiguo que iba bien, y en cuanto genero el exe vuelve a ocurrirme. La única forma que he conseguido para que no salga el error es poner un showmessage justo antes de que de el mensaje.
Cada vez que genero el exe, funciona bien la primera vez, las siguientes ya no, hasta que reinicio el equipo.
¿Alguna idea?


El codigo inicial (del dpr) es este

Código Delphi [-]
var
  IniAux: TIniFile;
  Mutex : THandle;
begin
  Mutex := CreateMutex(nil, True, 'GemaExclusiveMutex');
  if (Mutex <> 0) And (Windows.GetLastError =  0) then
    begin
      try
        with Application do
        begin
          if (ShortDateFormat = 'M/d/yyyy') then
          begin
            ShortDateFormat:='MM/dd/yyyy';
          end;
    //      showMessage('');        <--- si pongo el showmessage aqui es cuando funciona
          CreateForm(TDMFJoya, DMFJoya);
          CreateForm(TDM, DM);
          CreateForm(TFMain, FMain);
          if FMain.bErrorGrave then Exit;
          FMain.Visible := False;
          FMain.Show;
          if not FMain.bModoAutomatico then
          begin
            FMain.WmAfterCreate;
          end;
          Run;
        end;
      finally
        if Mutex <> 0 then
        begin
          DMFJoya.Free();
          CloseHandle(Mutex);
        end;
         IniAux.Free;
      end;
    end
  else
     ShowMessage('La aplicación ya está en ejecución');
Responder Con Cita
  #2  
Antiguo 31-07-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Parece que no liberas el Mutex.
Quizás se crea el mutex, pero da error porque ya existe y luego no se libera.
Yo siempre tengo el create seguido de try..finally. Dentro de esto el resto de la programación.
De esta manera evito la posibilidad de que no se libere por alguna condición escondida en la programación.

Código Delphi [-]
  o := TComponente.Create();
  try
    // Trabajar con o
    ...
  finally
    o.Free;
  end;


Código Delphi [-]
var
  IniAux: TIniFile;
  Mutex : THandle;
begin
  Mutex := CreateMutex(nil, True, 'GemaExclusiveMutex');
  try
    if (Mutex <> 0) And (Windows.GetLastError =  0) then
    begin
      with Application do
      begin
        if (ShortDateFormat = 'M/d/yyyy') then
        begin
          ShortDateFormat:='MM/dd/yyyy';
        end;
        // showMessage('');        <--- si pongo el showmessage aqui es cuando funciona
        CreateForm(TDMFJoya, DMFJoya);
        CreateForm(TDM, DM);
        CreateForm(TFMain, FMain);
        if FMain.bErrorGrave then Exit;
        FMain.Visible := False;
        FMain.Show;
        if not FMain.bModoAutomatico then
        begin
          FMain.WmAfterCreate;
        end;

        Run;
      end;
      DMFJoya.Free();
      IniAux.Free;
    end
    else
    ShowMessage('La aplicación ya está en ejecución');
  finally
    if Mutex <> 0 then
      CloseHandle(Mutex);
  end;
end;
Responder Con Cita
  #3  
Antiguo 31-07-2023
sEngine sEngine is offline
Miembro
 
Registrado: jul 2021
Posts: 53
Poder: 3
sEngine Va por buen camino
Gracias por la ayuda, lo he puesto tal y como has dicho pero me sigue pasando. Tiene que ser otra cosa
Responder Con Cita
  #4  
Antiguo 31-07-2023
Avatar de pgranados
pgranados pgranados is offline
Miembro
 
Registrado: sep 2022
Ubicación: México
Posts: 264
Poder: 2
pgranados Va por buen camino
Cita:
Empezado por sEngine Ver Mensaje
Gracias por la ayuda, lo he puesto tal y como has dicho pero me sigue pasando. Tiene que ser otra cosa
Libera tu componente.
FreeAndNil(objeto)

O usa una función para matar todos los procesos desde el administrador de tareas (puedes pedirle el código a chatGPT)
Responder Con Cita
  #5  
Antiguo 01-08-2023
Avatar de duilioisola
[duilioisola] duilioisola is offline
Miembro Premium
 
Registrado: ago 2007
Ubicación: Barcelona, España
Posts: 1.734
Poder: 20
duilioisola Es un diamante en brutoduilioisola Es un diamante en brutoduilioisola Es un diamante en bruto
Ahora queda ir probando cada parte...


1- Prueba quitando las partes de MUTEX.


2- Otra cosa que se me ocurre es que se esté tratando de mostrar algo "demasiado pronto". Pon una pausa donde pones el ShowMessage.
Por ejemplo:
Código Delphi [-]
  with Application do
  begin
    if (ShortDateFormat = 'M/d/yyyy') then
    begin
      ShortDateFormat:='MM/dd/yyyy';
     end;
     // Prueba con esto -----------
     Application.ProcessMessages;
     // ---------------------------
     CreateForm(TDMFJoya, DMFJoya);
     CreateForm(TDM, DM);
     CreateForm(TFMain, FMain);

3- También deberías probar moviendo la parte donde das formato a ShortDateFormat mas abajo. Puede que esto no sea ThreadSafe.
Responder Con Cita
  #6  
Antiguo 02-08-2023
sEngine sEngine is offline
Miembro
 
Registrado: jul 2021
Posts: 53
Poder: 3
sEngine Va por buen camino
Cita:
Empezado por duilioisola Ver Mensaje
Ahora queda ir probando cada parte...


1- Prueba quitando las partes de MUTEX.


2- Otra cosa que se me ocurre es que se esté tratando de mostrar algo "demasiado pronto". Pon una pausa donde pones el ShowMessage.
Por ejemplo:
Código Delphi [-] with Application do begin if (ShortDateFormat = 'M/d/yyyy') then begin ShortDateFormat:='MM/dd/yyyy'; end; // Prueba con esto ----------- Application.ProcessMessages; // --------------------------- CreateForm(TDMFJoya, DMFJoya); CreateForm(TDM, DM); CreateForm(TFMain, FMain);


3- También deberías probar moviendo la parte donde das formato a ShortDateFormat mas abajo. Puede que esto no sea ThreadSafe.

Lo de la pausa me ha funcionado, no pensé que eso fuera a ayudar pero así ha sido

Muchas gracias a todos por la ayuda!
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
Error haciendo una segunda consulta aggg63 Tablas planas 3 31-01-2013 17:23:23
Problema al abrir ini por segunda vez totote Varios 7 05-07-2008 21:08:40
error al actualizar un registro por segunda vez @-Soft Conexión con bases de datos 8 17-07-2006 15:11:15
Error al llamar por segunda vez al QReport Ana Cristina Impresión 4 09-07-2004 08:31:36
Error al cargar formulario por segunda vez sgarrido Varios 4 19-05-2004 23:06:15


La franja horaria es GMT +2. Ahora son las 04:26:58.


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