1

我目前正在为现有的 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;

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

当所有数据处理都以一种方法进行时,我如何使用 boost 创建线程setData(){...}

4

2 回答 2

2

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

于 2010-01-12T14:58:24.313 回答
1

您显然会想查看boost 线程库。

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

  • setData 的调用者能否处理函数返回时未完成的“设置”操作?
  • 如果正在运行,您将如何确保关闭期间的后台 setData 操作?
  • 您将如何处理 GUI 线程和 setData 线程之间的共享状态,以免导致竞争条件?
  • 您是否需要“通知”机制,以便在后台 setData 完成时 GUI 线程可以刷新(或执行某些操作)?
  • 如果有人在后台 setData 操作挂起时调用 setData 会发生什么?
于 2010-01-12T06:25:09.233 回答