Jump to content
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

PJ

Actualizar texto duma label

Recommended Posts

PJ

Eu estou lendo algumas centenas de registos de uma base de dados para um programa, o processo é demorado e eu queria tipo actualizar uma label na status bar para mostrar quantos registos é que faltam ler.

A questão é que eu altero o texto da label mas esta não é actualiza na interface, há alguma maneira de garantir que o texto apareça? Se criar uma MessageBox o texto é actualizado mas a ideia não é essa  :wallbash:

Share this post


Link to post
Share on other sites
ceptrus

usas uma thread para fazer a leitura da BD, assim escusas de "crashar" o teu programa enquanto estás a ler.

durante a leitura, o máximo que podes fazer é teres essa label a dizer algo tipo "a ler da BD, por favor aguardar", não dá para saberes nunca quantos registos faltam ler.

label.text = "a ler da BD, por favor aguarde";

//ler da BD

label.text = "acabou de ler";

se quiseres ter o código sem as threads é algo deste género que deves fazer..

mas como já disse, o melhor é meteres uma thread a ler da BD

Share this post


Link to post
Share on other sites
PJ

Eu já descobri a solução para isto que é mais fácil, e realmente garante que a interface é actualizada. O problema é que o programa está ocupado a carregar os valores para uma DataGridView que não "tem tempo" para actualizar a interface, então temos que obrigar a aplicação a actualizar a interface, processando todos os eventos que não tenham sido tratados.

Então aquilo que se tem que fazer é assim:

While(reader.Read())
{
    // Adiciona Registo à tabela
    ...
    // Actualiza a label
    statuslabel.Text = "Registo "+(++i);
    // Força o programa a actualizar a interface, forçando que todos os eventos sejam efectuados
    Application.DoEvents();
}

Isto também obriga que os elementos carregados já na tabela sejam mostrados, o programa torna-se um pouco lento quando começa-mos a carregar os elementos para a tabela e estes ficam na parte visível da mesma tipo apenas carrega uns 4 registos por segundo, mas quando sai da parte visível volta quase ao normal, carregando umas dezenas de registos por segundo.

A ideia da thread é muito boa porque assim realmente a interface ficará sempre a responder, o mal é que os eventos que são despoletados por nós ou pela aplicação, vão para uma fila de espera, que o programa só trata quando não está ocupado com outras coisas, ter uma thread a tratar da interface dá para tirar partido de processador multi-core, e mais rapidamente responder aos pedidos do utilizador.

No entanto nem isto garante que os registos da label sejam actualizados sempre, e pode levar ainda que a label tenha escrito que foram lidos x registos quando na verdade já foram lidos x+y, devido a problemas de concorrência, apesar de neste caso não alterar o comportamento do programa.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.