Como posso acrescentar uma grande quantidade de conteúdo rico (imagens, formatação) rapidamente para um controle sem o uso de toneladas de CPU?

StackOverflow https://stackoverflow.com/questions/148881

  •  02-07-2019
  •  | 
  •  

Pergunta

Eu estou usando wxWidgets e Visual C ++ para criar funcionalidade semelhante a usar Unix "tail -f" com formatação rica (cores, fontes, imagens) em uma GUI. Estou visando tanto wxMSW e wxMAC.

A resposta óbvia é usar wxTextCtrl com wxTE_RICH, usando chamadas para wxTextCtrl :: SetDefaultStyle () e wxTextCtrl :: WriteText ().

No entanto, no meu trabalho 3GHz, compilado no modo de versão, eu sou incapaz de manter tailing um log que cresce em média de 1 ms por linha, acabou ficando para trás. Para cada linha, eu estou incorrer em:

  1. duas chamadas para SetDefaultStyle ()
  2. duas chamadas dois WriteText ()
  3. Uma chamada para Freeze () e Thaw () do widget

Ao executar este, meu CPU vai para 100% em um núcleo usando wxMSW depois de encher-se cerca de 20.000 linhas. O programa é visivelmente mais lento uma vez que atinge um certo limite, ficando para trás.

Estou aberto a usar outros controles (wxListCtrl, wxRichTextCtrl, etc).

Foi útil?

Solução 3

Derive de wxVListBox. De docs:

wxVListBox é uma caixa de listagem do tipo de controlo com as seguintes duas diferenças principais de uma caixa de listagem normal: ele pode ter um arbitrariamente grande número de itens, porque não armazená-los em si, mas usa OnDrawItem () chamada de retorno para atraí-los (por isso é uma listagem virtual) e os itens podem ter uma altura variável, conforme determinado por OnMeasureItem () (por isso é também uma lista com as linhas de altura variável).

Outras dicas

Você considerou limitando a quantidade de linhas no modo de exibição? Quando tivemos um problema semelhante, só a certeza nunca mais do que 10.000 linhas estão na vista. Se mais linhas vêm em na parte inferior que remover linhas no topo. Isso não estava usando WxWidgets, ele estava usando um cacau UI nativa no Mac, mas o problema é o mesmo. Se uma vista texto com estilo (com cores, formatação e bonita impressão) cresce a grande, acrescentando mais dados na parte inferior torna-se muito lento.

Parece que o controle que você está usando é simplesmente não construído para a quantidade de dados que você está jogando para ele. Eu iria considerar a construção de um controle personalizado. Aqui estão algumas coisas que você poderia ter em conta:

  1. Quando uma nova linha vem em, você não precisa re-tornar as linhas anteriores ... eles não mudam eo layout não vai mudar devido à nova dados.
  2. Tente manter apenas a parte visível além de algumas telas de olhar para trás na memória de cada vez. Isso tornaria um pouco mais leve ... mas você terá que fazer seu próprio gerenciamento de rolagem, se você quiser que o usuário seja capaz de rolar para trás mais longe do que o seu olhar para trás e fazer tudo parecem ser sem costura.
  3. Não necessariamente atualizar uma linha de cada vez. Quando há novos dados, pegue tudo e atualização. Se você receber 10 linhas muito rapidamente, e você atualizar a tela de uma só vez, você pode economizar em alguns a sobrecarga de fazê-lo linha por linha.

Espero que isso ajude.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top