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

Posted

技术标签:

【中文标题】如何为单线程 GUI 应用程序创建额外的工作线程?【英文标题】:How might one create an extra worker thread for a single threaded GUI application? 【发布时间】:2010-01-12 05:30:24 【问题描述】:

我目前正在为现有的 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创建线程?

【问题讨论】:

【参考方案1】:

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

【讨论】:

【参考方案2】:

您显然会想查看boost thread 库。

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

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

【讨论】:

以上是关于如何为单线程 GUI 应用程序创建额外的工作线程?的主要内容,如果未能解决你的问题,请参考以下文章

如何为pyserial读取运行线程

与不是主线程的 GUI 线程通信

如何为超线程/多核选择最佳线程数?

如何为 xz 归档器设置默认参数?

如何为完成端口创建多个线程?

如何在 GUI 线程和工作线程之间共享数据?