OPERA?ÃO COM TREAD
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
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
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.
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.
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.
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.
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
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
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]
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]
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