OPERA?ÃO COM TREAD

MAXCIM 07/07/2014 09:32:01
#439374
Olá amigos bom dia!

estou iniciando em theads, e me deparei com erro de [Ô]Additional information: Operação entre threads inválida: controle [ô]ListBox1[ô] acessado de um thread que não é aquele no qual foi criado.[Ô]

segui os paços descritos em :
http://support.microsoft.com/kb/315577/pt-br e http://www.macoratti.net/vbn_thrd.htm

se alguém poder analisar e me informar onde estou errado.

grato
OCELOT 07/07/2014 12:26:40
#439381
Resposta escolhida
Threads não devem ser usadas para alterar os controles do Form, e antes que alguém venha e fale para mudar o CheckForIllegalCrossThreadCalls para false, esta propriedade é setara para true apenas pelo debugger, ela serve apenas para te ajudar a encontrar chamadas entre threads com o Windows Forms que não deveriam existir, ela vai automaticamente ser false em qualquer outro momento então não se deve modificar ela em momento algum.

Você deve usar threads apenas para processos demorados que não precisam alterar a interface gráfica, por exemplo, o download de um arquivo ou ler grandes quantidades de dados de um banco de dados.

Se quer mostrar o progresso deste processo então deve usar o método Invoke do form para indicar que a ação deve ser enviada para o Thread do form, porém isso é algo lento e deve ser usado o mínimo possível, por exemplo, em vez de setar o valor do progressbar para ser a quantidade de itens processados você seta ele para o maximo de 100, então na thread calcula a porcentagem já processada e só atualiza o progressbar quando a porcentagem mudar.
TUNUSAT 07/07/2014 13:40:16
#439391
MAXCIM,

O OCELOT falou tudo e deve ganhar a estrela.

Agora se você quiser um exemplo pronto, eu montei um aqui:
http://www.vbmania.com.br/index.php?modulo=detalhe&id=9326

[][ô]s,
Tunusat.
MAXCIM 07/07/2014 15:07:17
#439395
Gente, valeu pela força, o que preciso mesmo nem envolve parte gráfica.

ainda preciso de ajuda para fazer...

tenho uma parte do sistema que demanda um certo tempo, e bloqueia o sistema todo por algus segundos...
faço uma varredura no sistema e gero um log de aniversariantes, vencimentos de títulos, status e validade de lotes, vaidade de laudos e certificados de produtos e avaliação de fornecedores...

tudo isso, faço select por select, gero os logs, e faço os alertas aos usuários...
preciso passar isso para thead e liberar o sistema, mas ainda não tenho ideia de como fazer...

se poderem me orientar, em como fazer a conexão com banco, rodar query, colher resultado, gerar log e gravar essas informações.

desde já agradeço
PEGUDO 07/07/2014 15:57:41
#439396
Cara,
eu não abri e nem testei, mas tem um arquivo de ajuda aqui no fórum.
Veja se te ajuda:
[txt-color=#0000f0]Trabalhando com Threads[/txt-color]
OCELOT 07/07/2014 16:34:36
#439397
Citação:

:
Gente, valeu pela força, o que preciso mesmo nem envolve parte gráfica.

ainda preciso de ajuda para fazer...

tenho uma parte do sistema que demanda um certo tempo, e bloqueia o sistema todo por algus segundos...
faço uma varredura no sistema e gero um log de aniversariantes, vencimentos de títulos, status e validade de lotes, vaidade de laudos e certificados de produtos e avaliação de fornecedores...

tudo isso, faço select por select, gero os logs, e faço os alertas aos usuários...
preciso passar isso para thead e liberar o sistema, mas ainda não tenho ideia de como fazer...

se poderem me orientar, em como fazer a conexão com banco, rodar query, colher resultado, gerar log e gravar essas informações.

desde já agradeço


Se você faz isso em um formulário a forma mais fácil seria usando o BackgroundWorker.

Usar threads diretamente, e quando digo diretamente me refiro ao uso do objeto System.Threading.Thread é algo que não deve ser feito a menos que não tenha como usar as alternativas.

Como alternativa ao uso direto dele você tem por exemplo o BackgroundWorker, Task e o ThreadPool.QueueUserWorkItem

Todos eles vão usar Threads, só no caso do Task que pode ser que não use Thread e rode na atual dependendo dos parâmetros passados, a grande diferença é que é muito mais fácil usar eles do que criar a Thread manualmente, e no caso do Task e do ThreadPool ele ainda gerencia as Threads sozinho enfileirando as chamadas caso tenha muitas, afinal criar muitas threads de uma só vez também pode deixar o programa lento.

Mas no seu caso eu diria que o melhor deve ser o BackgroundWorker, ele já até possui um método e um evento para você poder passar valores para o formulário e deve ser o mais fácil de usar.
Tópico encerrado , respostas não são mais permitidas