GARANTIR DESCONTO

Fórum Problemas com o Timer !! #356998

11/04/2008

0

Olá Pessoal.

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

Ricvictor

Responder

Posts

12/04/2008

Marco Salles

acho meio dificil reposnder com clareza ... Pois vc mesmo disse :

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.


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]


Responder

Gostei + 0

13/04/2008

Ricvictor

Olá Marco.

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


Responder

Gostei + 0

13/04/2008

Catunda

Poste o código do evento ontimer para dar-mos uma olhada melhor.


Responder

Gostei + 0

17/04/2008

Ricvictor

Olá Catunda. Desculpe a demora na resposta. É que eu estava cirurgiado, daí os projetos tiveram de parar uns dias :wink:
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


Responder

Gostei + 0

17/04/2008

Emerson Nascimento

acho que pode estar havendo um estouro de pilha (um método chamando o outro infinitamente).

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.


Responder

Gostei + 0

17/04/2008

Rodc

Tenta também ir tirando códigos até funcionar, para saber onde está o erro.
Sugiro começar tirando o código do AfterConnect.


Responder

Gostei + 0

18/04/2008

Ricvictor

Colegas, consegui identificar o problema graças a dica do RODC.

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:


Responder

Gostei + 0

18/04/2008

Marco Salles

self.ExecAndWait(´Inner.exe´, ´´, SW_SHOW);

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


//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}


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 ?????

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.


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);



Responder

Gostei + 0

18/04/2008

Ricvictor

Olá Marco.

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


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar