如何增加 Qt 中线程的堆栈大小 - QThread::setStackSize() 似乎不起作用?

Posted

技术标签:

【中文标题】如何增加 Qt 中线程的堆栈大小 - QThread::setStackSize() 似乎不起作用?【英文标题】:How to increase stack size for a thread in Qt - QThread::setStackSize() seems not to work? 【发布时间】:2014-04-30 08:58:00 【问题描述】:

来自问题:SQLite stack overflow when running a bulk INSERT OR REPLACE with 500 rows: why?,我需要增加 Qt 中某个线程的堆栈大小。

我希望这是跨平台的,但我最初是尝试让它在 Windows 上运行。

不幸的是,我没有尝试成功增加相关线程的堆栈大小。 (我通过添加代码来评估当前堆栈大小(参见上面的链接)来测量堆栈大小,并观察在 1 MB 时发生堆栈溢出崩溃,这并不反映我正在尝试设置的堆栈大小。)

我尝试了以下方法:

在项目的 Qt 的 .pro 文件中:

QMAKE_CXXFLAGS += /F 32000000
QMAKE_LFLAGS   += /STACK:32000000

源码中,QThread::start()函数之前的那行在线程上被调用:

work_queue_manager_thread.setStackSize(static_cast<uint>(stackSize));

(其中work_queue_manager_threadQThread 实例,stackSize 是 32000000)。

我已经单独尝试了以上两种尝试,并且我已经尝试了它们。结果是相同的:所讨论线程的堆栈大小保持在 1 MB。它没有反映我想要的堆栈大小。我无法为我的 Qt 线程设置堆栈大小。

我如何实际上将 Qt 线程的堆栈大小设置为 32000000 - 并且以一种适用于 Windows 和 OS X 的方式?

谢谢。

【问题讨论】:

证明上述 QMAKE 标志有效。但是,使用 Qt Creator,执行 Clean All 并重新构建无法获取新标志。相反,必须删除整个 Debug/Release 文件夹,然后然后执行重建。然后就可以了。 您可以将其发布为您自己的答案并接受它 @PeterT - 同意,只是需要一点刺激。 :) 【参考方案1】:

结果是问题工作中指示的 QMAKE 标志。

但是,使用 Qt Creator,执行 Clean All 和重建并不能拾取新标志。相反,必须删除整个 Debug/Release 文件夹,然后执行重建。然后就可以了。

但这些标志仅适用于 Windows - 当我确定 OS X 标志时,我可能会更新此答案,希望很快。

尽管如此,这些标志仍按指示工作。

【讨论】:

以上是关于如何增加 Qt 中线程的堆栈大小 - QThread::setStackSize() 似乎不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

界面编程之QT的线程20180731

增加主程序的堆栈大小或为递归代码块创建一个具有更大堆栈大小的新线程?

创建堆栈大小为默认值 50 倍的线程时有啥危险?

QThread 中的堆栈大小

如何增加python中的堆栈大小

当前逻辑线程增加/线程堆栈泄漏