在我的应用程序中,我需要对一个相当大的数组进行排序,结果证明这是一个标准任务,例如std::sort
.
在 GUI 应用程序中,我想对排序的进度给出某种响应。我的第一个尝试是找出所需比较的大致数量(n*log2(n)
for std::sort
),然后简单地在传递的比较仿函数中计算它们到 std::sort
。这非常有效。
排序算法在单独的线程中执行,以保持 GUI 响应。它使用 Qt 的信号或一些类似的线程安全机制将其进度传达给 GUI。
但是,我也希望排序操作可以中断。也就是说,为用户提供了一个按钮或类似的东西来中止整个操作。目前我只看到两个选项:
- 抢先终止线程(
pthread_cancel
等) - 重写排序算法并插入明确的取消点。
考虑将线程取消作为最后的手段并拒绝重写标准库算法,我正在小心翼翼。
最佳答案
让比较函数检查原子标志,如果设置了标志则抛出异常。排序线程应该捕获异常并干净地退出。然后 GUI 线程只需要设置标志。
关于c++ - 可中断排序函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41524454/