Urgente: Problema colocando muitos items de uma vez numa ListBox em VB.NET

peter alien

Power Member
Pessoal, vejam se me conseguem ajudar. Já fiz montes de searches com o Google e até agora nada.

O problema é o seguinte:

Fiz um pequeno programa em VB.NET que não faz mais do que pedir números ao utilizador, depois mostra uma Listbox e duas Textboxes.

Uma Textbox mostra o nº total de combinações que se podem fazer com os nºs introduzidos pelo utilizador, a outra Textbox está a zero (é para ser incrementada cada vez que é encontrada uma combinação).

O que se passa é que eu quero que conforme o computador vá descobrindo as combinações as vá mostrando na Listbox e vá incrementando na 2ª Textbox (que indicará no fim, o nº de combinações encontradas).

O problema é que a Listbox ao mostrar as combinações, das duas uma, ou não mostra nada nem deixa incrementar a Textbox, e mostra tudo no fim, ou, aparecem uns refreshs esquisitos na Listbox.

Como é que eu posso fazer para a Listbox ir mostrando as combinações uma a uma (sem esses refreshs malucos) e ao mesmo tempo deixar a Textbox incrementar o seu valor. Já agora criei um botão para interromper essa execução, mas o programa só aceita o click nesse botão quando toda a tarefa descrita acima acaba.

Alguém me pode ajudar com isto, pois já ando passado com esta cena, que ainda por cima não rende nada.


Obrigadão.
 
Actualizava no fim.

Uma vez fiz também um programa que apenas pegava num inteiro, e incrementava-o num loop até um determinado valor. Esse inteiro era exibido numa label. Haviam mais duas ou três labels (já não me lembro) que exibiam tanto a multiplicação por um valor, divisão e subtracção.
Eu fiz este programa para ver a velocidade que o computador tinha ao efectuar uma determinada rotina de código.

O que se passou foi exactamente isso. De cada vez que o loop fazia uma volta, os valores não eram actualizados, apenas no final (que não havia maneira de calcular).

O que fiz, foi fazer uma Thread que fazia os calculos e os mandava para o Form. Desta maneira, o From estava ocupado a exibir os dados, e a Thread a calcula-los.

Não sei se isto é um problema do .NET, ou de VB, ou se é suopsto se comportar assim mesmo, mas a maneira que arranjei de exibir os dados à medida que o loop ia correndo, foi com um processo paralelo.
 
Uppsssss

Um processo paralelo é uma thread (Hyper threading processor) já deves ter ouvido falar. Mas afinal esquece, parece que estava errado. Existe uma função para fazer update aos eventos durante um processo.
 
Tens dois métodos que pertencem tanto á textbox como á listbox:
- Invalidate
- Update
Ambos tentam "re-pintar" a janela. Experimenta se um deles te serve.
Tambem podes sempre meter o código que altera o valor das textbox e listbox numa thread aparte caso os 2 métodos não façam aquilo que pretendes
 
Última edição:
Boas.

Tens que ter em atenção o seguinte:

O refresh da página implica um postback, que sempre leva algum tempo. Se calhar a tua rotina devolve resultados mais depressa do que a pagina consegue fazer esse refresh.
Acho que a melhor hipótese neste caso é fazeres a funcão em jscript para calcular e mostrar os valores clientside.

Cumps.

EDIT:
Lol, desculpa, pensei que fosse asp.net mas reparei agora que não. Esquece lá o que disse :D
 
DoEvents faz isso...

O Application.DoEvents() acho que faz o pertendido. Apenas tens de o colocar dentro do Loop. Aparentemente a aplicação só corre os eventos assim que todos tenham sido executados. Ao carregares num botão para de fazer varios updates a uma ListBox, ele executa todo o código antes de fazer o update...

PS: A explicação não é minha, ainda não tentei (inginheiiro, esta foi dedicada a ti ... NOT)
.
 
Última edição:
Threads

Ai está como podes criar e fazer correr um thread nova (em c#):
Código:
private System.Threading.Thread umaThread = null;

//assumindo que tinhas um botão "btnIniciar" e que tinhas o evento "click" do botão mapeado para "btnIniciar_Click".
private void btnIniciar_Click(object sender, System.EventArgs e)
{
	umaThread = new System.Threading.Thread(new System.Threading.ThreadStart(UmaFunccao));
	umaThread.Name = "Uma Thread";
	umaThread.Start();
//este Start() faz correr a funcção "UmaFunccao" como uma thread aparte.
}

private void UmaFunccao()
{
	//calcula coisas
}

Agora só tens que pôr o código que faz os calculos e o código que altera o valor das textboxes e listboxes em threads diferentes. Ou seja, usa a thread principal para uma destas tarefas e a nova thread para a outra tarefa.

NOTA: O código está em c#.Net, tens que passar isso para vb.net.
 
Obrigadão pessoal,

já experimentei fazer uma nova Thread, uma vez que nunca tinha feito isso antes, e correu bem.

Mas para o prog que estou a fazer o método Application.DoEvents correu ás mil maravilhas.

Obrigadão mais uma vez a todos.
 
Back
Topo