O NeoMatrix Tech está de casa nova!

Você deverá ser redirecionado em 6 segundos. Se não, visite:
http://www.leonelfraga.com/neomatrixtech
e atualize seus favoritos.

Aviso IMPORTANTÍSSIMO!

Aviso aos navegantes:

O NeoMatrix Tech mudou de casa!!!

A partir de agora, acessem pelo novo endereço:

http://www.leonelfraga.com/neomatrixtech

Ué... mas é só o domínio mudou de lugar?

R: Na verdade, não é bem assim hehe. Este domínio que você acessa agora aponta para um blog hospedado no Blogger, enquanto no novo, aponta para um blog na plataforma Wordpress, hospedagem própria, muito mais rápida e com um layout mais agradável de ler ;)

Não vou fechar este domínio igual ao que eu fiz com o NM Light (que já está 100% na nova plataforma). Talvez beeeeeeem depois eu faça isso.

Todos os posts daqui se encontram lá, e novos posts serão colocados somente no novo endereço.
A única coisa que não consegui importar foram os comentários. Mas em breve vai ter um post contando sobre a epopéia que foi migrar o NeoMatrix Tech!

Somente vou fechar a área de comentários daqui. Caso queiram comentar, favor ver o post correspondente no "Novo NeoMatrix Tech" e comentem por lá. É bem melhor! (pena que os permalinks "amigáveis para SEO" não funcionam lá, dá erro 404 e não consigo fazer a configuração funcionar. E olha que eu já vi vários artigos falando desse assunto :( ).

Quem assina o feed, já está lendo o conteúdo do novo NeoMatrix Tech!

quarta-feira, 15 de abril de 2009

Momento POG: O famoso GOTO

Muito “discriminado” pelos programadores mais experientes, e os mais novos raramente usam, a instrução GOTO virou sinônimo de Gambiarra.

goto

Existente desde os primórdios da programação, serve basicamente para saltarmos incondicionalmente para um ponto do programa, geralmente determinado por um label (não, não é o componente de interfaces gráficas que você está pensando não).

Substituído por IF’s e outras estruturas de controle de fluxo, ninguém lembra que ele existe.

Mas até mesmo em C# ele me salvou de algumas :-)

Tive que terminar um Console Application cuja função é verificar uma caixa de e-mail a cada tantos segundos, e ao pressionar a tecla “Q” a aplicação se encerrava.

Verificar a caixa a cada tantos segundos… imediatamente me veio a idéia de instanciar um Timer, coisa que eu fiz: Configurei no método Main() da aplicação o timer e tal.

Só que aí veio um pequeno problema: o método Main() era executado e a aplicação saia do ar.

Me vieram algumas idéias:

1. Fazer a aplicação esperar uma tecla: Coloquei um método ReadKey(), pois assim o fluxo do método Main() ficaria esperando até que o usuário pressionasse uma tecla, porém o Timer ficaria executando em uma thread a parte (isso é automático), mas teria o problema do usuário ir lá, apertar QUALQUER tecla e a aplicação sai do ar.

   1: static void Main(string[] args)
   2: {
   3:     /*Declaração e configuração do timer...*/
   4:  
   5:     Console.Write("Pressione qualquer tecla para sair...");
   6:     Console.ReadKey();
   7:  
   8: }

2. Fazer um looping até que uma determinada tecla seja pressionada: Como eu disse acima, somente ao pressionar a tecla “Q” é que o programa deveria sair do ar. Veja como ficou o código:

   1: static void Main(string[] args)
   2: {
   3:     /*Declaração e configuração do timer...*/
   4:  
   5:     ConsoleKeyInfo k = new ConsoleKeyInfo();
   6:     Console.Write("Pressione 'Q' para sair...");
   7:     while (!k.KeyChar.ToString().ToUpper().Equals("Q"))
   8:     {
   9:         k = Console.ReadKey();
  10:     }
  11: }

O timer continuaria executando em uma thread à parte, porém temos um probleminha: O looping faz o programa consumir praticamente toda a CPU para si! E como o servidor onde vai rodar esse bicho BOMBA, isso é inadmissível.

3. A Solução definitiva: Como “prender” a saída da aplicação a uma determinada tecla, modificando o fluxo do método Main() sem usar um looping? Foi com essa idéia que tive o insight de usar o famigerado GOTO com o auxílio de um if:

   1: static void Main(string[] args)
   2: {
   3:     /*Declaração e configuração do timer...*/
   4:                 
   5:     ConsoleKeyInfo k = new ConsoleKeyInfo();
   6:     Console.Write("Pressione 'Q' para sair...");
   7:     fluxo:
   8:     k = Console.ReadKey();
   9:     if (!k.KeyChar.ToString().ToUpper().Equals("Q"))
  10:     {
  11:         goto fluxo;
  12:     }
  13: }

Como você pode ver, declarei o label fluxo antes da instrução que faz a aplicação guardar uma tecla, e após uma tecla ser pressionada é feita uma verificação: Se for diferente de “Q”, o programa volta para a instrução de aguardar uma tecla.

Com isso, o programa não consome muita CPU e o meu Timer ficou executando em outra thread, e fazendo o que tem que fazer!

PS: Já prevendo, eu sei que para este caso a melhor alternativa seria fazer um Windows Service, porém eu ainda não sei como construir um (e nem tive tempo de dar uma googlada sobre o assunto :-( ). Como o programa em si está em uma biblioteca de classes, a implementação é muito simples, pois é só instanciar a classe e chamar os métodos dentro do evento OnElapsed de um Timer (igual foi feito no Console Application).

Um abraço!

2 comentários:

Chris Benseler 8 de mai de 2009 20:06:00  

Quem nunca fez um POG coloque a mão aqui...

De qq. forma dou graças a Deus não trabalhar mais com backend e ter que apelar para coisas desse tipo.
*não que, com frontend, não apelemos com coisas diferentes - e talvez até piores!

[]s!

Leonel Fraga de Oliveira 9 de mai de 2009 16:53:00  

@Chris

Verdade... no front end ainda temos que encarar os "resquícios" da Guerra dos Browsers (principalmente quem faz app web).

Mas graças a Deus que eu me resignei e no lugar do Console Application, fiz uma aplicação Windows Form que fica no SysTray, assim "matei" essa POG e a aplicação ficou mais elegante hehe.

[]'s!


Postar um comentário

Para tornar este artigo ainda mais interessante, escreva suas críticas (desde que construtivas e sem ofenças), elogios, sugestões, complementos, dúvidas, etc, etc, etc!!!

Sobre o NeoMatrix Tech

Meu blog para assuntos profissionais, ligado com tecnologia.
Dicas de programação (grande parte de C# e ASP.NET, mas não limitado a essa plataforma :-) ), dicas de utilitários, análises de equipamentos e serviços, resenhas sobre sites que eu visito, relacionados com tecnologia, opinião sobre mercado de trabalho, metodologias de desenvolvimento, comportamento no mundo tecnológico...

NeoMatrix Light

  © Blogger templates ProBlogger Template by Ourblogtemplates.com 2008 - Editado e configurado por Leonel F.

Voltar ao TOPO