如何为单线程 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 应用程序创建额外的工作线程?的主要内容,如果未能解决你的问题,请参考以下文章