Criando Threads no Visual Basic.NET

O objetivo deste TM é mostrar como você pode criar threads para executar tarefas em processos separados. Nas versões anteriores do VB isso não era possível, embora pudesse se fazer algo parecido com o DoEvents. Mas a partir do VB.NET a criação de threads se tornou algo fácil e muito útil em determinadas situações. Para que você entenda o desenvolvimento é recomendado que possua bons conhecimentos de programação e Visual Basic ...

17/07/03h

Diminuir o tamanho das letras Aumentar o tamanho das letras
Microsoft .NET

O objetivo deste TM é mostrar como você pode criar threads para executar tarefas em processos separados. Nas versões anteriores do VB isso não era possível, embora pudesse se fazer algo parecido com o DoEvents. Mas a partir do VB.NET a criação de threads se tornou algo fácil e muito útil em determinadas situações. Para que você entenda o desenvolvimento é recomendado que possua bons conhecimentos de programação e Visual Basic.

Software utilizado:

- Microsoft Visual Studio.NET 2003 Enterprise Architect (também conhecido como "Everett" ou versão 7.1) - Beta Final

Requisitos do sistema: (Para instalação completa, que contém todas as linguagens e recursos)

- Processador Intel Pentium II /AMD K6-2 a partir de 450 Mhz (Pentium III/AMD Duron a partir de 600 Mhz recomendados)

- Memória RAM: 96 Mb para Windows 2000 Pro (Recomendado 128 MB),  192 Mb para Windows 2000 Server (Recomendado 256 MB), 96 Mb para Windows XP Home (Recomendado 160 MB) e 192 Mb para Windows XP Pro/Windows Server 2003 (Recomendado 256 MB)

- 4.1 GB no drive da instalação e 900 Mb no drive do sistema

- Sistema Operacional: Windows 2000*, Windows XP ou Windows.NET Server 2003 (é possível executar aplicações desenvolvidas com o VS.NET no Windows 98/Me/NT 4 mas não é possível desenvolver as aplicações nesses sistemas) * o Windows 2000 Datacenter Server não é suportado     

- Drive de CD-ROM ou DVD-ROM

- Placa de vídeo e monitor que suporte resolução de 800x600 e 256 cores (Recomendado High Color 16-Bit)

- Mouse

Quando usar threads ?

As threads devem ser utilizadas principalmente em processos assíncronos, tais como: transferência de dados via Sockets, operações com arquivos (Stream), utilização de protocolos de comunicação (HTTP) e portas de comunicação (COM, Paralela etc). As threads não são criadas automaticamente pelo .NET Framework e para que elas existam é preciso que o desenvolvedor as defina.

Muitas vezes no Visual Basic 6 nos deparamos com situações como uma gravação em banco de dados feita em larga escala que demoram algum tempo a ser executada e se quisessemos que o usuário tivesse a opção de clicar num botão "Cancelar" para interromper o processo nós deveríamos utilizar um loop e o DoEvents para monitorar este botão ou então utilizar APIs altamente complexas e pouco documentadas. Se não fizessemos isso a aplicação ficaria travada até o fim da gravação e as ações do usuário tais como cliques e reposicionamento de forms ficavam em uma fila (spool) para que fossem execudas após o fim da gravação.

A partir do VB.NET é possível fazer essa gravação em um processo separado da aplicação que cuida do clique no botão. Essa é uma situação dentre muitas outras, tais como programas de FTP e chat por exemplo. Aqui desenvolveremos um programa simples que preencherá uma ListBox em um looping e exibirá um MessageBox em processos separados.

Primeiramente abra o Visual Studio.NET e crie uma nova apliação "Windows Application" do tipo "Visual Basic Projects":


Nova aplicação - ThreadsApp

Agora coloque um Listbox (chamado "Lista") e um Button (chamado "btnMessage") no form:


Layout do form

Em seguida colocaremos o código para que o form funcione. Clique duas vezes numa área vazia do form para acessar o evento Form1_Load e digite o seguinte código:

Dim mThread As New System.Threading.Thread(AddressOf Contador) 'cria o objeto de processo mas não o dispara
mThread.Start() 'dispara o novo processo

Logo abaixo deste evento crie uma Sub igual a mostrada abaixo:

  Sub Contador()
    Dim i, x As Integer

    For i = 0 To 20
      For x = 0 To 500
        Lista.Items.Add(i.ToString & " - " & x.ToString)
      Next
    Next
    MessageBox.Show("Terminou!", "Contador")
  End Sub

Note que quando criamos o objeto "mThread" nós estamos definindo ele como uma instância da classe Thread que localiza-se no namespace System.Threading. Devemos também estabelecer que procedimento faz parte do processo e por isso há o parâmetro "AdressOf" onde colocamos a Sub Contador. O método "Start" do objeto dispara a sub.

Atenção: defina a duração dos laços For de acordo com a sua máquina. Um For com um contador muito grande pode causar instabilidade. Neste exemplo a máquina utilizada é um AthlonXP 1800+ com 256Mb RAM DDR e se a sua máquina tem capacidade de processamento inferior, diminua progressivamente os contadores de acordo com o clock (i até 10 e x até 250 para uma máquina menos potente não deverá causar problemas).

Coloque o seguinte código no evento Click do botão btnMessage:

  MessageBox.Show("Mensagem ao mesmo tempo da contagem!", "Mensagem")

Esse botão apenas mostra um MessageBox, algo que será feito no processo original da aplicação. Note que quando executarmos o form ele já iniciará preenchendo o ListBox - mas como isso está sendo feito em um processo separado, podemos pressionar o botão "Mensagem" livremente e o MessageBox será mostrado ao mesmo tempo que o ListBox é preenchido. Paa tirar quaisquer dúvidas veja a janela de código: (clique no detalhe para vê-la por inteiro)


Detalhe do código

Execute sua aplicação pressionando F5. Pressione o botão "Mensagem". Veja o resultado:


Form em estado normal, logo após pressionar F5



Mensagem exibida após clicar no botão



Processo de contagem concluída

Veja abaixo o Task Manager mostrando os dois processos (Tasks). "Exemplo de Threads" é o nosso form e essa thread cuida da exibição da MessageBox do botão. A thread "Contador" é onde se executa o preenchimento da ListBox. Veja:


Processos no Task Manager

Note que se você fechar o form (clicando no "X") sem fechar a MessageBox, a aplicação não será encerrada enquanto a MessageBox com o texto "Concluído" não for fechada pois eles estão em processos diferentes. Experimente substituir o comando "mThread.Start" por "Contador()": nesse caso você estaria chamando a Sub Contador() no mesmo processo e não conseguiria clicar no botão "Mensagem". (se você quiser fazer este teste, coloque a chamada da Sub Contador no evento Form1_Paint para que o contador só seja inicado após o form aparecer na tela)

Conclusão

O uso de Threads é muito útil por exemplo quando iremos executar um processo muito demorado e queremos mostrar uma mensagem para o usuário, ou mesmo executar dois ou mais processos ao mesmo tempo. Seu uso é recomendado em operações assíncronas, tais como manipulação de arquivos. Vale lembrar que não é recomendado utilizar muitas threads em sua aplicação pois isso aumenta a quantidade de recursos utilizados e pode causar instabilidades no sistema: tenha bom senso e utilize threads quando realmente for necessário.

Marcas Registradas
Visual Basic, Visual Basic.NET, Visual Studio.NET, Windows são marcas registradas da Microsoft Corporation.
Todos os demais nomes registrados, marcas registradas ou direitos de uso citados neste TM pertencem a seus respectivos proprietários.

 

Autor original:  ClawHammer
Direitos Autorais:  BABOO




imprima este artigo
envie este artigo via e-mail

 

Artigos relacionados


Mais Notícias desta Área

Últimas Notícias
 
 Software  |  Hardware  |  Segurança  |  Tecnologia  |  Tutoriais  |  Download  |  Web  | Desenvolvimento  |  Fórum 
 Mundo Corporativo  |  Carreira  |  Mercado  |  Telecom  |  Servidores  |  Tecnologia 
    BABOO é um site brasileiro de TI focado em informática, tecnologia, software,hardware, tutoriais e downloads, e soluções de dúvidas através do nosso fórum.

 

Artigos do BABOO