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

nokPT

[Resolvido] Flicker ou imagem a piscar em refress

15 mensagens neste tópico

Bom dia,

No tópico: http://www.portugal-a-programar.pt/index.php?showtopic=24728#lastPost, está explicado como se metem 2 (ou mais) imagens (transparentes ou não) num painel.

Essa partes está resolvida, o problema é que tenho que fazer um refress a cada segundo, para alterar uma das imagens, só que quando faço refress, a imagem inteira (ou se quiserem o ecran quase todo) pisca em quanto faz "rebuid".

Há alguma maneira de fazer isto sem a imagem inteira piscar, porque ao fim de alguns segundos a olhar para o ecran, damos em maluco.

Já li algures em DoubleBuffer, mas ou não percebi como devo fazer ou não funciona,

Já fiz suspend e resume layout, também não funciona

Alguma ideia?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tens razão (um pequeno erro ortográfico).

Também já tentei com:

Invalidate

O resultado é o mesmo.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu nao preçebo um coto disto, mas acho uqe ajax é a tua solução, alguem que preceba dessa linguagem que te ajude.

cumps.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Também já me falaram em Delphi, mas tem que ser em VB.NET por vários motivos

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

isso precisa mesmo de ser online? não pode ser actualizado tipo de 5 em 5 segundos? se puder, mete um timer a actualizar as imagens...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é online, neste momento faço actualização a cada segundo com um timer, o problema é que a actualização está a ser feita num PaintEvent e para disparar esse evento faço Refresh ou Invalidate.

O problema é que o programa 1º limpa o ecran, depois pões as imagens, uma atrás da outra, o problema é que não altera só as que peço, põe sempre todas e isso faz piscar muito o ecran...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não estou a perceber porque fazes a actualização no PaintEvent.. Não podes criar uma função que dependendo de variaveis faz o load a um ou outra imagem? e chamas essa função no timer? e outra coisa.. isso precisa de ser ao segundo? Para evitar o flicker podes esconder os objectos todos no inicio e depois mostrar no fim...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A imagem que tenho que fazer é um sinóptico de uma instalação, tem vários tubos, bombas, válvulas, etc...

Ao todo, tenho que representar cerca de 30 a 50 equipamentos (Ligado=Verde, Desligado=Cinza, Alarme=Vermelho, etc...).

A primeira ideia (não quer dizer que esteja certa, mas parece-me) foi carregar a imagem de fundo, depois dependendo do estado de cada equipamento carregar imagens do equipamento com a respectiva cor.

Estou a usar o Paint, porque não sei outra maneira de meter imagens com fundo transparente.

Estou a usar um timer para de segundo a segundo, actualizar os estados dos equipamentos nas imagens...

Só que o que acontece quando dispara o timer é:

1º limpa a imagem

2º desenha a imagem relativa ao 1º equipamento

3º desenha a imagem relativa ao 2º equipamento

4º ...

até acabar de desenhar, como resultado, vemos aparecer o desenho e a reaparecer (bocadinho a bocadinho) mesmo que o estado de um dado equipamento não altere, acontece isso.

A ideia de carregar uma imagem para cada estado, não me parece viável, com 30 equipamentos a 3 estados cada um, tenho 90 imagens possíveis...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

eu nao preçebo um coto disto, mas acho uqe ajax é a tua solução, alguem que preceba dessa linguagem que te ajude.

cumps.

AJAX é para a net

@nokPT

Sinceramente não entendi (também não li tudo) qual é o teu problema. Podes explicar-me e colocar aqui as imagens que dão problema para testar ?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E se pores isso doutra forma, ou seja pões as duas ou mais fotos em vários images e depois no time é só mandares esconder uma imagem e mostrar outras. Por aí adiante...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não estamos a falar de fotos ou imagens parecidas, estamos a falar de um esquema simplificado de uma instalação industrial...

Mas a título de exemplo:

Imaginem um prédio visto de frente, com as janela todas fechadas, a certa altura alguém abre uma janela, o que pretendo é desenhar o prédio com todas as janelas fechadas, menos a que está aberta. O que fiz foi 1º em backgoud desenhar o prédio e depois acrescentar as janelas.

O problema é que cada vez que uma pessoa abre ou fecha a janela, todo o desenho é reconstruido, o que faz o ecran (porque o desenho é do tamanho do ecran) piscar, o que é muito agressivo para os nosso olhos.

Entretanto, noutro tópico deste forum (no tópico original que está no início deste tópico - cada problema, cada tópico diferente) conseguimos encontrar a solução.

O que estava a fazer era invalidate ou refresh todo o desenho, não sabia como é que dizia só uma parte a resposta é: invalidade com coordenadas:

        Dim rc As Rectangle
        rc.X = 120
        rc.Y = 20
        rc.Width = 50
        rc.Height = 50
        Panel1.Invalidate(rc)

Assim, só actualizo a janela que abriu ou fechou (esta parte do desenho continua a piscar, mas OK)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Ja tive um problema semelhante a esse.

A maneira mais fácil que encontrei para resolver o "piscar" foi colocar uma copia da imagem anterior enquanto a outra actualizava, e depois bastava por invisível essa copia.

Mas para o teu caso, provavelmente dava muito trabalho, pois parece-me que tens muitas imagens.

No meu caso, acabai por arranjar uma maneira mais eficaz.

Construí um "listener" para os campos que queria actualizar, quando algo fosse modificado, ai sim, actualizava. (para essa actualização, continuo a usar o método que disse acima).

E bom pq assim só realmente actualiza quando e necessário e também para não subcarregar tanto o programa.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A ideia é mesmo essa, estar a monitorizar os estados permanentemente e só alterar o desenho se houver algumas alteração de estado.

Só que no pior caso pode haver uma alteração a cada segundo, por isso o sistema deverá estar preparado para actualizar de segundo a segundo, mas o mais provável é só actualizar 1 ou 2 vezes durante 10 minutos a cada hora

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a cena do piscar, como disse, acabai por resolver sobrepondo as imagens, antes de actualizar fazia essa copia aparecer, actualizava a outra e fazia a copia desaparecer.

Mesmo a actualizar de 1 em 1 seg, ele não pisca.

Agora no teu caso, não sei se isto da jeito.

0

Partilhar esta mensagem


Link 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