Fórum Problemas com o Timer !! #356998
11/04/2008
0
Seguinte: Desenvolvi uma aplicação onde de tempos em tempos, preciso processar umas informações. Daí coloquei um Timer. Para evitar que a aplicação ficasse sendo mostrada na barra de tarefas do windows (e assim qualquer pessoa pudesse finalizar a aplicação), resolvi esconder um pouquinho deixando visível apenas no Tray do windows (ícones perto do relógio). Utilizei para isso o RxTrayIcon.
O problema é que minha aplicação está finalizando sozinha. Já procurei pra caramba e tenho absoluta certeza de não ter colocado nenhum comando para finalizar a aplicação. OBSERVEI que o programa fica rodando somente durante o tempo setado no TIMER (na propriedade Interval). Finalizado o tempo, fecha a aplicação.
Alguém poderia me dar uma luz do que possa estar acontecendo? Como posso solucionar?
A aplicação é para ficar rodando direto. Utilizei o Timer apenas para controlar quando as informações devem ser processadas.
Espero que me ajudem.
Grande abraço a todos.
Ricardo Lucena
Natal/RN
Ricvictor
Curtir tópico
+ 0Posts
12/04/2008
Marco Salles
Mas so uma sugestão para se obter performance nesse tipo de aplicação
o mais correto é :
[b:3d2bdab235]criar um serviço e usar TTheads para o processamento[/b:3d2bdab235]
Gostei + 0
13/04/2008
Ricvictor
Sabes onde posso encontrar algum material bom sobre TTheads ? Realmente não sei o que pode estar acontecendo com a minha aplicação. Iniciada, começa o Timer a contar ... daí a aplicação só fica funcionando pelo tempo definido na propriedade ´interval´ do Timer. Finalizado o tempo, a aplicação fecha :-( ...
Aguardo por retorno. Grande abraço.
Ricardo Lucena
Natal/RN
Gostei + 0
13/04/2008
Catunda
Gostei + 0
17/04/2008
Ricvictor
Mas é o seguinte:
No evento ontimer do Timer, coloco...
//verifica conexão com o Banco, onde Connection é um componente Database.
if not (Connection.Connected) then
Connection.Connected:=True;
No afterconect do componente Database, procedo com as minhas instruções de processamento, criação de arquivo texto de log, etc e tal.
No show do form, coloquei...
Timer1.OnTimer(self);
O problema que não consigo visualizar é que a minha aplicação só fica funcionando pelo tempo definido na propriedade interval do Timer. Quando acaba o tempo, o programa simplesmente se encerra. :cry:
Alguma idéia ?
Desde já, agradeço.
Abraço.
Ricardo Lucena
Natal/RN
Gostei + 0
17/04/2008
Emerson Nascimento
faça assim:
no OnShow do form, coloque:
Timer1.Enabled := True; // liga o Timer1
no OnTimer do Timer1, coloque:
Timer1.Enabled := False; // desliga o timer para não "encavalar" processos
if not (Connection.Connected) then
Connection.Connected:=True;
{faça o processamento necessário}
Timer1.Enabled := True; // religa o timer para efetuar o processo novamente
´[i:83f87838d8]No afterconect do componente Database, procedo com as minhas instruções de processamento, criação de arquivo texto de log, etc e tal.[/i:83f87838d8]´
não sei o que isso quer dizer mas se as ´[i:83f87838d8]instruções de processamento[/i:83f87838d8]´ citadas acima forem aquelas que necessitam ser feitas ´de tempos em tempos´, sugiro tirá-las do afterconnect e colocá-las no OnTimer.
Gostei + 0
17/04/2008
Rodc
Sugiro começar tirando o código do AfterConnect.
Gostei + 0
18/04/2008
Ricvictor
Pra vcs visualizarem também, segue abaixo. Estou mandando executar um programa externo, através de um procedimento:
//executa o inner
self.ExecAndWait(´Inner.exe´, ´´, SW_SHOW);
//depois de executado o inner, me libera um arquivo texto. Daí não preciso mais que o inner fique em execução. Com isso, peço para ele fechar.
//Fecha a aplicação do inner
//WM_CLOSE -> Fecha a aplicação pedindo confirmação (msg) WM_QUIT -> Fecha direto
PostMessage(FindWindow(nil, PChar(´Gerenciador de Inners´)), WM_QUIT,0,0); {AQUI É ONDE ESTÁ A BRONCA, FINALIZANDO A APLICAÇÃO}
//Não está fechando apenas o que estou pedindo, mas tudo.
Vou ver uma outra forma de executar um programa externo (exemplo, uma calculadora) e pedir para fechá-lo depois, sem que afete a aplicação principal. Se tiverem algum procedimento ou idéia simples para se fazer essas operações, aguardo aqui.
Mas AGRADEÇO mesmo a todos que me mandaram msgs tentando solucionar essa minha questão.
Vlw... :wink:
Gostei + 0
18/04/2008
Marco Salles
so uma curiosidade , este método .ExecAndWait é uma procedure interna , de algum componente ou coisa e tal :?: :?: :?: Não lembro de ter visto coisa parecida na VCL ou ser nativa do delphi
so uma pergunta básica ... Inne.exe é um aplicativo certo ... O Nome da janela deste aplicativo é ´Gerenciador de Inners´ ???? Não teria a sua aplicação principal o mesmo nome da janela ?????
como mesmo voce colocou é um procedemento simples
//Abrir e executar a calculadora winexec(´calc.exe´,SW_SHOW); //Fechar a calculadora PostMessage(FindWindow(nil, PChar(´form1´)), WM_QUIT,0,0);
Gostei + 0
18/04/2008
Ricvictor
ExecAndWait é uma função que encontrei na net outro dia. Segue seu código abaixo:
function TFrmPrincipal.ExecAndWait(const FileName, Params: string; const WindowState: Word): boolean;
var
SUInfo: TStartupInfo;
ProcInfo: TProcessInformation;
CmdLine: string;
begin
{ Coloca o nome do arquivo entre aspas. Isto é necessário devido aos espaços contidos em nomes longos }
CmdLine := ´´´ + Filename + ´´´ + Params;
FillChar(SUInfo, SizeOf(SUInfo), #0);
with SUInfo do
begin
cb := SizeOf(SUInfo);
dwFlags := STARTF_USESHOWWINDOW;
wShowWindow := WindowState;
end;
Result := CreateProcess(nil, PChar(CmdLine), nil, nil, false,
CREATE_NEW_CONSOLE or NORMAL_PRIORITY_CLASS, nil,
PChar(ExtractFilePath(Filename)), SUInfo, ProcInfo);
{ Aguarda até ser finalizado }
if Result then
begin
WaitForSingleObject(ProcInfo.hProcess, INFINITE);
{ Libera os Handles }
CloseHandle(ProcInfo.hProcess);
CloseHandle(ProcInfo.hThread);
end;
end;
{
RESOLVI NÃO MAIS USAR ESSA FUNÇÃO E SIMPLIFICAR O CÓDIGO. VOU TESTAR A SOLUÇÃO FINAL USANDO O VELHO E BOM SHELLEXECUTE ATRAVÉS DO COMANDO...
//executa o inner
ShellExecute(0,nil,´Inner.exe´,´´,nil,sw_shownormal);
}
E respondendo a tua última pergunta, Marco, ´Gerenciador de Inners´ é o título da janela da aplicação Inner.exe.
A questão agora é ver o porquê que o comando ´PostMessage(FindWindow(nil, PChar(´Gerenciador de Inners´)), WM_QUIT,0,0);´ está fechando toda a minha aplicação, onde deveria fechar apenas o Gerenciador de Inners :(
Valeu pela ajuda. Aguardo retorno se tiveres alguma idéia.
Ricardo Lucena
Natal/RN
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)