Pergunta

Atualmente estou desenvolvendo novos recursos para um aplicativo VCL existente.O aplicativo cria gráficos e imagens estáticas usando um pacote de terceiros chamado TeeChart.Há um caso em que preciso carregar 2 milhões de pontos de dados para criar um gráfico de imagem estática.No entanto, isso leva um tempo para carregar e o usuário não pode fazer nada no aplicativo até que seja concluída.Portanto, eu preferiria criar um thread de trabalho para processar os pontos de dados para que a GUI não congele.

O método setData() define as seguintes variáveis ​​de membro, que o componente VCL irá usar para criar o gráfico:

// Holds the Y position for the image (columns)
DynamicArray<double>* mpda_XValues;

// Holds the colour for the corresponding element in the x and y
// position
DynamicArray<double>* mpda_YValues;

// Holds the z position for the image (rows)
DynamicArray<double>* mpda_ZValues;

O que devo considerar ao criar um thread de trabalho?

Como posso criar o thread usando boost quando todo o processamento de dados ocorre em um método setData(){...}?

Foi útil?

Solução

Como você está usando a VCL, pode ser uma boa ideia dar uma olhada na classe TThread.Crie uma classe herdada disso e use o método Synchronize ao se comunicar com seu thread principal.Você pode tentar olhar para: http://docwiki.embarcadero.com/VCL/en/Classes.TThread e http://docwiki.embarcadero.com/RADStudio/en/Defining_Thread_Objects

Outras dicas

Você obviamente vai querer dar uma olhada no impulsionar tópico biblioteca.

Isso é (provavelmente) mais complicado do que você pensa.Converter uma função síncrona que tem efeitos colaterais em uma função assíncrona não é trivial.Algumas coisas a considerar:

  • Os chamadores de setData serão capazes de manipular a operação "setting" não sendo feito quando a função retorna?
  • Como você garantirá a operação setData em segundo plano durante o desligamento, se houver algum em andamento?
  • Como você lidará com o estado compartilhado entre o thread da GUI e o setData thread, como para não causar raça Condições?
  • Você vai precisar de uma "notificação" , para que o thread GUI possa atualizar (ou fazer algo) quando o conjunto de dados em segundo planoData concluído?
  • O que acontece se alguém chamar setData enquanto uma operação setData em segundo plano está pendente?
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top