Ir ao conteúdo

Delphi :: Barra de Progresso


alexmbm

Posts recomendados

Postado

A TProgressBar está me dando dor de cabeça!

Eu e um colega estamos trabalhando em um programa que precisa mostrar uma barra de progresso em três momentos. De cada vez, ela tem de terminar os 100%, parar um segundo, e então o programa deve continuar, mostrando o resultado daquele processamento em sua janela principal.

Trata-se de carragamento de arquivos e processamento adicional. Estamos tentando inserir a execução da barra junto à máquina do programa, na mesma linha de execução. Talvez o problema esteja aí! Interface e processamento parecem estar se confundindo, mas isso é só um palpite.

A tal barra aparece em uma janela separada, que abre por cima da janela principal do programa. Quando ela está progredindo, se clicarmos o mouse, a interface fica feia, suja, e a barra não anda mais, até aquele processamento terminar e a janela com a barra sumir. Então o programa volta ao normal, mostrando a tela principal.

O que pode ser?! Quem pode me explicar como é o tratamento interface-threads que o Delphi faz? Sei que no Java, de toda forma, para ter uma barra progresso funcionando corretamente, tenho de colocá-la em outra thread, pois naquele ambiente a interface gráfica default compartilha da mesma thread da execução principal do programa.

  • Membro VIP
Postado

Não sei se você sabe, mas vários componentes do VCL não são Thread-safe. Ou seja, se você chamar eles direto de uma thread secundária você pdoe causar erros estranhos. Isso inclui até bitmaps.

O que você deve fazer é que todo e qualquer objeto gráfico (principalmente este, mas existem outros não-gráficos que também não são thread-safe), que precisar ser acessado pela thread secundária deve ser manipulados por uma procedure executada via Synchronize (tipo Synchronize(atualizaprogressbar) ).

Então cuidado se for usar um programa multithread.

Uma solução simples para eliminar esse problema é executar o comando Application.ProcessMessages na parte do código mais intensa. Isso será fazer uma pausa para atualizar a tela e não irá acontecer o problema que você descreveu.

Essa última solução é bem mais simples. você apenas precisa incluir no looping, para ser executado periodicamente.

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!