Como alguém pode criar um thread de trabalho extra para um único aplicativo GUI com thread?
-
20-09-2019 - |
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(){...}
?
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?