1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

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

Discussão em 'Programação' iniciada por peter alien, 24 de Janeiro de 2005. (Respostas: 12; Visualizações: 1197)

  1. peter alien

    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.
     
  2. BraBo

    BraBo Banido

    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.
     
  3. peter alien

    peter alien Power Member

    E como é que se faz isso BraBo, um processo paralelo ?
     
  4. Feiticeiro

    Feiticeiro Power Member

  5. peter alien

    peter alien Power Member

    Boas Feiticeiro,

    não, em VB.NET.
     
  6. BraBo

    BraBo Banido

    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.
     
  7. MaTreCo

    MaTreCo Power Member

    Boas. Já não me lembro da sintaxe exacta mas tenta procurar pelo comando "DoEvents", salvo erro, permite fazer o que queres.
     
  8. NoMercy

    NoMercy Power Member

    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: 25 de Janeiro de 2005
  9. Feiticeiro

    Feiticeiro Power Member

    Sorry. Pensava que era em Asp.Net.
     
  10. JGAlmeida

    JGAlmeida Folding Colaborator

    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
     
  11. BraBo

    BraBo Banido

    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: 25 de Janeiro de 2005
  12. NoMercy

    NoMercy Power Member

    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.
     
  13. peter alien

    peter alien Power Member

    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.
     

Partilhar esta Página