Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Trabalhando com threads (multi-tarefas)

Actualmente, e com os processadores de vários núcleos, é possível tornar as aplicações mais robustas e funcionais permitindo um melhor desempenho global da aplicação. Existem em muitas aplicações diversos processos que são secundário e que podem funcionar "à parte" da mesma. Este processos podem ter diversos fins como a manutenção da aplicação, backup de informação, execução de serviços demorados, etc.

De notar que não existe uma melhoria de rendimento pois as threads são executadas como background e não como tarefa principal. Isto é, são executadas de uma forma secundária e não trazem melhorias na realização de tarefas rápidas. No entanto aliviam a aplicação de processo demorados permitindo ao utilizados continuar a trabalhar sem qualquer tempo de espera.

Imagine que efectua um backup de uma aplicação sempre que inicia o programa. Existem então um tempo de espera até que o processador termine a cópia e/ou compactação da informação. Esta tarefa pode e deve ser executada à parte permitindo o programa arrancar sem que o utilizador se preocupe.

Mas vamos ver um exemplo simples de utilização:

Imports System.Threading

Public Class ThreadTest

' Um delegate é uma referência ou apontador a um
' método e como a thread em si não pode executar

' operações é necessário utiliza-lo
Delegate Sub myDelegate()

' Chama o delegate
Private Sub backupThreadMain()
    If Me.InvokeRequired Then
        Me.Invoke(New myDelegate(AddressOf startBackUp))
    End If
End Sub


' Inicia o backup
Private Sub startBackUp ()
    ' código para cópia/backup
End Sub

' Código inicial do form
Private Sub frmBackUp_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles MyBase.Load

    ' Cria e inicia uma nova thread
    Dim bkThread As New Threading.Thread(AddressOf backupThreadMain)
    bkThread.Priority = ThreadPriority.Highest
    bkThread.IsBackground = True
    bkThread.Start()
End Sub

End Class


No VB.NET é possível utilizar o controlo backgroundworker que não é mais do que uma ferramenta que permite a execução de tarefas(threads) de uma forma simplificada.


PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

3 comentários:

Gabriel disse...

Criei 2 threads e quando uma delas entra em loop infinito, a outra para também. Eu acreditava que como threads simulariam um funconamento paralelo, a outra continuaria. Mas não é o que ocorre.

Aguardo dicas.

jpaulino disse...

Olá Gabriel!

Sem ver código é dificil. Mostre o seu código ou envie para o email vbtuga(at)gmail.com

manerba@gmail.com disse...

Criei um array de threads com o seguinte código

Trd(i) = New Thread(AddressOf ExecutavbScript)
Trd(i).IsBackground = True
Trd(i).Name = mvarNOME
Trd(i).CurrentCulture = System.Threading.Thread.CurrentThread.CurrentCulture
Trd(i).Start()

private sub ExecutavbScript()

Dim vObject1 as object
vObject1 = createobject("TesteDll.Teste")
Call vObject1.msg

End sub

o que acontece é que quando executo apresente a mensagem

"O CLR não conseguiu fazer a transição do contexto COM 0x1b0008 para o contexto COM 0x1b0178 em 60 segundos. O thread que possui o context/apartment de destino está provavelmente fazendo uma espera sem bombeamento ou processando uma operação de execução muito longa sem bombeamento das mensagens do Windows. Geralmente, essa situação tem um impacto negativo no desempenho e pode até mesmo levar à falta de resposta do aplicativo ou ao acúmulo contínuo de uso de memória com o tempo. Para evitar esse problema, todos os threads com um único apartment em thread (STA) devem usar primitivos de espera de bombeamento (como CoWaitForMultipleHandles) e bombear rotineiramente as mensagens durante operações de execução longa."

O que percebi que só acontece quando utilizo o CreateObject dentro de uma função executada pela threada, mas seu eu executar fora, funciona normalmente.

Como posso resolver isso ??


Att,

Haiam

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico