Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Se para al activarse el salvapantallas (https://www.clubdelphi.com/foros/showthread.php?t=81405)

mosco 11-11-2012 20:23:40

Se para al activarse el salvapantallas
 
El programa se ejecuta perfectamente hasta que salta el salvapantallas de windows (3 minutos). El programa se sale de un bucle repeat...until que en principio no se tendria que salir hasta haber pulsado un TButton. El bucle lo tengo protegido con un try...except..end

¿Como se puede solucionar?


Gracias y saludos a todos.

Casimiro Notevi 11-11-2012 20:25:56

¿El programa?, ¿qué programa?, deberías explicar las cosas claramente, ya que no podemos adivinar :)

mosco 11-11-2012 20:37:09

Discupe Casimiro, por mi falta de detalles, bajo mi ignorancia pensé que no hacia falta ser más explícito. A continuación pongo el bucle que comenté arriba. Es el bucle del que se sale cuando salta el salvapantallas de windows. Espero que alguien me pueda ayudar.

Código Delphi [-]
procedure TForm1.Button2Click(Sender: TObject);
  begin
    Button1.Enabled:=False;
    Button2.Enabled:=False;
    try
      repeat
        Application.ProcessMessages;
        Memo1.Clear;
        BorraBuffer;
        EnviaDatos('....');
        RecibeDatos;
        if DatosConConexion = 0 then break;
        Memo1.Font.Size:= 300;
        Memo1.Lines.Text := IntToStr(FuerzaSenial);
        sleep(500);
      until (Button3.Tag = 1) or (Button4.Tag = 1);
      Memo1.Clear;
      Memo1.Font.Size:= 10;
      Button1.Enabled:=True;
      Button2.Enabled:=True; 
      Button3.Tag:= 0;
      Button4.Tag:= 0;
    except
    end;
  end;

Gracias

Casimiro Notevi 11-11-2012 22:01:55

Sigues sin explicar las cosas claramente, ese 'EnviarDatos' y similares ¿a dónde se conecta?, porque lo que ocurre es que el salvapantallas también "pone a dormir" el puerto/canal/cable/conexión/etc. que usas para ese proceso que haces. Deberías decirle al sistema para que no lo ponga a domir :)

mosco 11-11-2012 22:33:46

Exacto Casimiro, son dos tuberias (pipes) que creo para comunicarme con un servidor (router) y los procesos de enviar y recibir son los siguientes:

Código Delphi [-]
procedure EnviaDatos(Cadena: string);
var
  i: integer;
  begin
    for i:= 1 to length(Cadena) do
      begin
        buf[i-1]:= Cadena[i];
        buf[length(Cadena)]:= #13; // Añadimos "intro" para que el comando se introduzca
      end;  
    WriteFile(write_stdin,
              buf,
              length(Cadena)+1,
              bread,
              Nil);
  end;

procedure RecibeDatos;
  Begin
    BorraBuffer;
    sleep(100);
    PeekNamedPipe(read_stdout,@buf,BUFFERSIZE-1,@bread,@avail,NiL);
    // Chequear si hay datos para leer en stdout
    if (avail <> 0) then
      Begin
        ReadFile(read_stdout,
                 buf,
                 BUFFERSIZE,
                 bread,
                 Nil);
        FuerzaSenial:= StrToInt(buf[bread-20] + buf[bread-19]);
        DatosConConexion:= 1;
      end
    else
      begin
        DatosConConexion:= 0;
        showmessage('No hay conexion establecida');
      end
  end;

Se crean las dos pipes para enviar y recibir datos y las mantengo abiertas hasta que salgo del programa. Cuando salgo cierro todos los handles.
Puedo poner el codigo completo de las dos unidades que componen el programa pero me parece un poco extenso.

nlsgarcia 12-11-2012 00:14:29

mosco,

Cita:

Empezado por mosco (Mensaje 449196)
El programa se ejecuta perfectamente hasta que salta el salvapantallas de windows (3 minutos).

Dudas:

1- ¿La falla se presenta con cualquier opción de Protector de Pantalla de forma automática y manual independientemente del lapso de tiempo?

2- ¿Haz probado comentar de manera selectiva (De lo general a lo específico) el código dentro del Repeat-Until para tratar de aislar la falla?

3- ¿Haz probado el programa en otro Computador con igual y diferente Sistema Operativo Windows?

4- ¿Haz probado el programa en el mismo Computador en Modo Safe?

En Resumen: La idea general es tratar de aislar la falla para posteriormente encontrar su solución.

Prueba hacer este cambio:
Código Delphi [-]
   Loop := True;

   Repeat

   // Tu Código.
 
   // Permite cancelar el ciclo externamente por medio de la variable global Loop
   until Loop = False;
Espero sea útil :)

Nelson.

ecfisa 12-11-2012 00:58:12

Hola mosco.

Si el problema es el protector de pantalla, otra opción es desactivarlo temporalmente y luego del proceso activarlo. (Zarko Gajic)

Por ejemplo:
Código Delphi [-]
function ActivateScreenSaver(Activate: boolean): boolean;
var
  IntActive: byte;
begin
  if Activate then
    IntActive := 1
  else
    IntActive := 0;
  Result := SystemParametersInfo(
   SPI_SETSCREENSAVEACTIVE, IntActive, nil, 0);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  Button1.Enabled:=False;
  Button2.Enabled:=False;
  try
    try
      ActivateScreenSave(False);
      repeat
        Application.ProcessMessages;
        Memo1.Clear;
        BorraBuffer;
        EnviaDatos('....');
        RecibeDatos;
        if DatosConConexion = 0 then break;
        Memo1.Font.Size:= 300;
        Memo1.Lines.Text := IntToStr(FuerzaSenial);
        sleep(500);
      until (Button3.Tag = 1) or (Button4.Tag = 1);
    finally
       ActivateScreenSaver(True)
    end;
    Memo1.Clear;
    Memo1.Font.Size:= 10;
    Button1.Enabled:=True;
    Button2.Enabled:=True;
    Button3.Tag:= 0;
    Button4.Tag:= 0;
  except
   ...
  end;
end;

Saludos.

mosco 13-11-2012 22:46:57

Muchas gracias señores por su ayuda. Ya lo he solucionado (hace tan solo unos minutos). Lo he solucionado simplemente colocando un Try...excep...end en el procedimiento "RecibeDatos" de la Unidad 2.
Ya no le afecta el salvapantallas. !!!Que cosas oye!!!.

Saludos.


La franja horaria es GMT +2. Ahora son las 10:12:07.

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