Comando para fechar programa com TCP Client Server
Olá amigos, tenho uma aplicação TCP cliente e servidor criado com os componentes da Indy10.
Gostaria do cliente enviar um comando para o servidor para que o programa fosse fechado, mas não está dando certo, alguém sabe pq, e sabe como q posso fazer para este comando funcionar?
estou fazendo desta maneira:
Obrigado!!
Gostaria do cliente enviar um comando para o servidor para que o programa fosse fechado, mas não está dando certo, alguém sabe pq, e sabe como q posso fazer para este comando funcionar?
estou fazendo desta maneira:
Mensagem := AContext.Connection.IOHandler.ReadLn(TIdTextEncoding.Default); if (Mensagem = 'FECHARPROGRAMA') then Application.Terminate;
Obrigado!!
Fernando Vr
Curtidas 0
Respostas
Fernando Vr
03/12/2012
Ninguém tem idéia??
GOSTEI 0
Rodolpho Silva
03/12/2012
Tente usar o Halt:
Porém, isso é como "matar" o seu processo no S.O. ou seja, termina a execução do mesmo sem tratamento algum.
Mensagem := AContext.Connection.IOHandler.ReadLn(TIdTextEncoding.Default); if (Mensagem = 'FECHARPROGRAMA') then Halt;
Porém, isso é como "matar" o seu processo no S.O. ou seja, termina a execução do mesmo sem tratamento algum.
GOSTEI 0
Fernando Vr
03/12/2012
Tente usar o Halt:
Porém, isso é como "matar" o seu processo no S.O. ou seja, termina a execução do mesmo sem tratamento algum.
Mensagem := AContext.Connection.IOHandler.ReadLn(TIdTextEncoding.Default); if (Mensagem = 'FECHARPROGRAMA') then Halt;
Porém, isso é como "matar" o seu processo no S.O. ou seja, termina a execução do mesmo sem tratamento algum.
Ah obrigado amigo, testarei aqui, mas fazendo desta forma tem algo q possa ser prejudicial ao programa? por terminar sem nenhum tratamento??
GOSTEI 0
Wasley Portes
03/12/2012
Fernando, você pode fazer a comunicação com Sockets. Fica muito bom.
GOSTEI 0
Fernando Vr
03/12/2012
Fernando, você pode fazer a comunicação com Sockets. Fica muito bom.
Então Wasley Alves Portes eu não gostaria de utilizar sockets pq eu to usando o Delphi XE2, queria utilizar o Indy mesmo.
Mas em sockets você tem alguma idéia de como fazia pra fechar totalmente o aplicativo? do modo q o amigo Rodolpho123 passou ele até fecha o servidor, mas o mesmo continua ativo nos processos do windows, não está fechando completamente.
GOSTEI 0
Fernando Vr
03/12/2012
Tente usar o Halt:
Porém, isso é como "matar" o seu processo no S.O. ou seja, termina a execução do mesmo sem tratamento algum.
Mensagem := AContext.Connection.IOHandler.ReadLn(TIdTextEncoding.Default); if (Mensagem = 'FECHARPROGRAMA') then Halt;
Porém, isso é como "matar" o seu processo no S.O. ou seja, termina a execução do mesmo sem tratamento algum.
Eu testei aqui Rodolpho123, e to tendo um problema ainda, o form do programa some da tela com o comando que vc me passou, mas ai tentei executar o servidor novamente e dá o seguinte erro.
[b]Could not bind socket. Address and port are already in use.[/b]
Então fui verificar os processos do windows e o programa continua aberto, só o form q sumiu mas o programa continua lá. Está dando o mesmo problema do Application.Terminate;
Será q não tem nenhum modo de fazer ele fechar por completo??
GOSTEI 0
Rodolpho Silva
03/12/2012
Ah, é um serviço (TService)?
Tente isso:
Tente isso:
Mensagem := AContext.Connection.IOHandler.ReadLn(TIdTextEncoding.Default); if (Mensagem = 'FECHARPROGRAMA') then DoShutdown;
GOSTEI 0
Wasley Portes
03/12/2012
Você irá enviar uma mensagem, ao receber no servidor você pode executar um Application.Terminate.
GOSTEI 0
Fernando Vr
03/12/2012
[b]Rodolpho123[/b]
Então Rodolpho123 Não é um Tservice não, é um VCL Forms Aplication com TIdTCPServer dos componentes do Indy10.
O comando pra fechar, chega a fechar o form, mas continua ativo nos processos do windows, da uma olhada na imagem abaixo:
[img]http://i45.tinypic.com/15ov402.jpg[/img]
[b]Wasley Alves Portes[/b]
Eu já fazia desta forma Wasley, da uma olhada no início deste tópico como eu tava fazendo ao receber a mensagem do cliente, o problema q a unica coisa q acontece é q o form fecha mas a aplicação continua rodando nos processos do windows. Da uma olhada na imagem acima que foi feita depois q o comando pra fechar foi executado. Você pode perceber q a aplicação continua lá.
Muito obrigado pela ajuda amigos, se conhecer outra solução por favor me ajude, ja pesquisei muito sobre isso e até agora não encontrei nenhuma solução.
Ah, é um serviço (TService)?
Tente isso:
Tente isso:
Mensagem := AContext.Connection.IOHandler.ReadLn(TIdTextEncoding.Default); if (Mensagem = 'FECHARPROGRAMA') then DoShutdown;
Então Rodolpho123 Não é um Tservice não, é um VCL Forms Aplication com TIdTCPServer dos componentes do Indy10.
O comando pra fechar, chega a fechar o form, mas continua ativo nos processos do windows, da uma olhada na imagem abaixo:
[img]http://i45.tinypic.com/15ov402.jpg[/img]
[b]Wasley Alves Portes[/b]
Você irá enviar uma mensagem, ao receber no servidor você pode executar um Application.Terminate.
Eu já fazia desta forma Wasley, da uma olhada no início deste tópico como eu tava fazendo ao receber a mensagem do cliente, o problema q a unica coisa q acontece é q o form fecha mas a aplicação continua rodando nos processos do windows. Da uma olhada na imagem acima que foi feita depois q o comando pra fechar foi executado. Você pode perceber q a aplicação continua lá.
Muito obrigado pela ajuda amigos, se conhecer outra solução por favor me ajude, ja pesquisei muito sobre isso e até agora não encontrei nenhuma solução.
GOSTEI 0
Fernando Vr
03/12/2012
Olá amigos, muito obrigado pela atenção, em outro forum q estou participando me passaram a forma correta e funcionou perfeitamente. Para quem tiver o mesmo problema q eu, segue a solução.
O comando para fechar o aplicativo completamente inclusive pelo processo do windows, seria este:
[b] TerminateProcess(GetCurrentProcess, 0);[/b]
Então o meu código ficou desta forma:
Abraços.
O comando para fechar o aplicativo completamente inclusive pelo processo do windows, seria este:
[b] TerminateProcess(GetCurrentProcess, 0);[/b]
Então o meu código ficou desta forma:
if (Mensagem = 'FECHARPROGRAMA') then TerminateProcess(GetCurrentProcess, 0);
Abraços.
GOSTEI 0