Как можно создать дополнительный рабочий поток для однопоточного приложения с графическим интерфейсом?

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

Вопрос

В настоящее время я разрабатываю новые функции для существующего приложения 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 находится в ожидании?
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top