tiujhou 7 Denunciar post Postado Janeiro 20, 2014 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
wprmsite 0 Denunciar post Postado Fevereiro 4, 2014 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
tiujhou 7 Denunciar post Postado Fevereiro 15, 2014 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