Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

tiujhou

Sleep trava Programa

Recommended Posts

Galera é o seguinte... estou fazendo um programa, onde existe vários Loop um dentro do outro...

 

Após terminar a 1º passagem em todos os Loops, ele retornar e tenta verificar se existe uma determinada pasta, se ela não existir ele continua, mas se ela existe eu tento esperar uns 30 segundos, no qual a cada 1 segundo ele verifica se a pasta existe, pois ela é deletada com um arquivo .bat... daí não tenho controle de quanto tempo ele irá demorar para deletá-la... Neste caso estou usando Sleep(1000) ... mas está travando muito o programa... e em outros locais do programa irei utilizar o sleep, no qual trava mais e mais...

 

Já li em vários sites... alguns indicam :

 

 

Application.ProcessMessages; 

 

Deu uma melhorada... mas continua travando...

 

Outros falam sobre o TTIMER e outros sobre Threads... |Para a minha situação o que seria ideal, para que o programa parasse de travar, e mais ou menos como fazer isso... se puderem ajudar...

 

//Inicio Loop de 30 segundo tempo
    time_ini := 0;
    while time_ini < 30  do
    Begin
      if DirectoryExists(local_exe) then
      Begin
         time_ini := time_ini  + 1;
         if time_ini >= 30 then
         Begin
            Break;
         End else
         Begin

           sleep(1000);
           continue;
         End;
      End else
      Begin
         Break;
      End;
    End;

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você disse que aguarda os 30 segundos pois esta realizado a exclusão de uma pasta por um arquivo BAT. Inicialmente pensei: Por que não utilizar uma função para isto? (DeleteFile). Enfim, como são sei o motivo vou lhe da uma dica. Você também disse que não tem o controle de quanto tempo o arquivo BAT levará para excluir a pasta, por isso aguarda os 30 segundos. Então faça o seguinte:

 

Execute seu arquivo bat com este código que assim sua proxima instrução só será executada após o arquivo ser encerrado. Assim não precisará deste trecho de código.

 

 

Function WinExecAndWait(FileName: String; const visivel: Boolean; const Wait: Boolean): Boolean;
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  Done: Boolean;
begin
  FillChar(StartInfo, SizeOf(TStartupInfo), #0);
  FillChar(ProcInfo, SizeOf(TProcessInformation), #0);


  if (not visivel) then
    StartInfo.dwFlags := STARTF_USESHOWWINDOW;
  try
{$IFDEF UNICODE}
    if StringRefCount(FileName) = -1 then
    begin
      FileName := Copy(FileName, 1, MaxInt);
    end;
{$ENDIF UNICODE}
    Done := CreateProcess(nil, PChar(FileName), nil, nil, False,
      CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil, nil, StartInfo,
      ProcInfo);
    Result := Done;


    if (Result and Wait) then
      WaitForSingleObject(ProcInfo.hProcess, INFINITE);


  finally
    CloseHandle(ProcInfo.hProcess);
    CloseHandle(ProcInfo.hThread);
  end;


end;

 

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

 

Você disse que aguarda os 30 segundos pois esta realizado a exclusão de uma pasta por um arquivo BAT. Inicialmente pensei: Por que não utilizar uma função para isto? (DeleteFile). Enfim, como são sei o motivo vou lhe da uma dica. Você também disse que não tem o controle de quanto tempo o arquivo BAT levará para excluir a pasta, por isso aguarda os 30 segundos. Então faça o seguinte:

 

Execute seu arquivo bat com este código que assim sua proxima instrução só será executada após o arquivo ser encerrado. Assim não precisará deste trecho de código.

 

 

Function WinExecAndWait(FileName: String; const visivel: Boolean; const Wait: Boolean): Boolean;
var
  StartInfo: TStartupInfo;
  ProcInfo: TProcessInformation;
  Done: Boolean;
begin
  FillChar(StartInfo, SizeOf(TStartupInfo), #0);
  FillChar(ProcInfo, SizeOf(TProcessInformation), #0);


  if (not visivel) then
    StartInfo.dwFlags := STARTF_USESHOWWINDOW;
  try
{$IFDEF UNICODE}
    if StringRefCount(FileName) = -1 then
    begin
      FileName := Copy(FileName, 1, MaxInt);
    end;
{$ENDIF UNICODE}
    Done := CreateProcess(nil, PChar(FileName), nil, nil, False,
      CREATE_NEW_PROCESS_GROUP + NORMAL_PRIORITY_CLASS, nil, nil, StartInfo,
      ProcInfo);
    Result := Done;


    if (Result and Wait) then
      WaitForSingleObject(ProcInfo.hProcess, INFINITE);


  finally
    CloseHandle(ProcInfo.hProcess);
    CloseHandle(ProcInfo.hThread);
  end;


end;

 

Tudo bom wprmsite... Bem interessante o que você passou... neste caso, não irei usar neste programa pois ele foi terminado há alguns dias... , mas nos próximos irei tentar com este comando passado por você...

 

Eu resolvi meu problema utilizando DELAY ... funcionou corretamente...

 

http://www.planetadelphi.com.br/dica/983/delay

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.