Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

PJ

Actualizar texto duma label

Mensagens Recomendadas

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:

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros 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.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.