QtConcurrent问题

火花20180731 2019-09-17 05:54:31
一个单例,单例内实例化了一个源model和一个消息订阅管理器controller,controller接收到新消息就会更新源model。单例提供了接口createTable用来创建显示数据的页面(可以创建多个页面),这个页面类中有一个QSortFilterProxyModel的派生类用来展示数据并进行排序和筛选(多个页面的proxyModel指向一个源model)。考虑到数据量大的情况下排序和筛选会比较耗时,所以我用QtConcurrent来创建一个线程,线程结构如下:
QtConcurrent::run([=]() {
while (m_bThreadRunning)
{
QPair<int, QVariantMap> task;
task.first = NoTask;
if (!m_taskQueue.isEmpty())
{
QMoutexLocker locker(&m_mutex);
if (!m_taskQueue.isEmpty())
{
task = m_taskQueue.dequeue();
}
}
switch (task.first)
{
case SortTask:
{
int column = task.second.data("column").toInt();
Qt::SortOrder order = Qt::SortOrder(task.second.data("order").toInt());
// 排序
QSortFilterProxyModel::sort(column, order );
emit taskFinished();
}
break;
case FilterTask:
// 过滤
invalidateFilter();
emit taskFinished();
break;
default:
break;
}
}
});

我用类似的结构创建了三个不同名的单例类A,B,C,把它们打包到一个库中了,使用的时候,在一个项目的两个不同模块中都用到了这个展示数据的页面,所以同一个单例的createTable被调用了两次,我发现:
第一个初始化的模块中的三个页面数据的筛选和过滤是正常的,第二个模块中只有第一个调用的createTable创建的页面的筛选和过滤是正常的,但是其他两个都不能进行筛选和过滤。
通过断点调试后发现,那两个不能筛选和过滤的页面实际上已经把筛选/排序任务都加载到m_taskQueue队列中了,任务一直在这个队列中累加却没有被消费,但是对QtConcurrent这段代码打断点,发现m_taskQueue却始终为空,仿佛在QtConcurrent中又实例化了一个新的m_taskQueue。这个问题的奇怪之处就在于,A单例createTable在两个模块中创建的两个页面都是正常的,BC却只在第一个模块中正常,在第二个模块中就出问题了。


...全文
268 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

16,201

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧