如何为单线程GUI应用程序创建额外的工作线程?

时间:2010-01-12 05:30:25

标签: c++ multithreading boost vcl boost-thread

我目前正在为现有的VCL应用程序开发新功能。该应用程序使用名为TeeChart的第三方包创建图表和静态图像。 有一个实例,我必须加载200万个数据点来创建静态图像图表。但是,这需要一段时间才能加载,用户无法在应用程序中执行任何操作 直到它完成。因此,我更愿意创建一个工作线程来处理数据点,以便GUI不会冻结。

方法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;

创建工作线程时我应该考虑哪些事项?

当在一个方法setData(){...}中进行所有数据处理时,如何使用boost创建线程?

2 个答案:

答案 0 :(得分:2)

由于您使用的是VCL,因此查看TThread类可能是个好主意。从中创建一个继承的类,并在与主线程通信时使用Synchronize方法。您可以尝试查看:http://docwiki.embarcadero.com/VCL/en/Classes.TThreadhttp://docwiki.embarcadero.com/RADStudio/en/Defining_Thread_Objects

答案 1 :(得分:1)

您显然希望查看boost thread库。

这可能比您想象的要复杂得多。将具有副作用的同步函数转换为异步函数并非易事。有些事情需要考虑:

  • setData的调用者是否能够 处理“设置”操作不是 在函数返回时完成?
  • 如果正在运行,您将如何确保关机期间的后台setData操作?
  • 您将如何处理共享状态 你的GUI线程和 setData线程,以免引起竞争 条件?
  • 您需要“通知”吗? 机制,所以GUI线程可以 刷新(或做某事)时 background setData完成了吗?
  • 如果有人调用setData会发生什么 而后台setData操作 待定?