Как можно создать дополнительный рабочий поток для однопоточного приложения с графическим интерфейсом?
-
20-09-2019 - |
Вопрос
В настоящее время я разрабатываю новые функции для существующего приложения VCL.Приложение создает диаграммы и статические изображения, используя сторонний пакет под названием TeeChart.Есть один случай, когда мне нужно загрузить 2 миллиона точек данных, чтобы создать диаграмму статического изображения.Однако для загрузки требуется некоторое время, и пользователь ничего не может сделать в приложении пока оно не будет завершено.Поэтому я бы предпочел создать рабочий поток для обработки точек данных, чтобы графический интерфейс не зависал.
Метод setData()
задает следующие переменные-члены, которые затем компонент VCL будет использовать для создания диаграммы:
// 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;
Какие вещи я должен учитывать при создании рабочего потока?
Как я мог бы создать поток с помощью boost, когда вся обработка данных происходит одним методом setData(){...}
?
Решение
Поскольку вы используете VCL, возможно, было бы неплохо взглянуть на класс TThread.Создайте унаследованный от этого класс и используйте метод Synchronize при взаимодействии с вашим основным потоком.Вы можете попробовать посмотреть на: http://docwiki.embarcadero.com/VCL/en/Classes .TThread и http://docwiki.embarcadero.com/RADStudio/en/Defining_Thread_Objects
Другие советы
Вы, очевидно, захотите взглянуть на повышающий поток библиотека.
Это (вероятно) сложнее, чем вы думаете.Преобразование синхронной функции, которая имеет побочные эффекты, в асинхронную функцию нетривиально.Некоторые вещи, которые следует учитывать:
- Смогут ли вызывающие setData обработать операцию "настройка", которая не выполняется при возврате функции?
- Как вы будете обеспечивать фоновую работу setData во время завершения работы, если она продолжается?
- Как вы будете обрабатывать общее состояние между вашим потоком GUI и потоком setData, чтобы не вызывать гонки условия?
- Понадобится ли вам механизм "уведомления" , чтобы поток графического интерфейса мог обновляться (или что-то делать) после завершения фоновых setData?
- Что произойдет, если кто-то вызовет setData в то время как фоновая операция setData находится в ожидании?