【发布时间】:2015-06-04 01:36:27
【问题描述】:
我在 Qt/C++ 中开发了一个应用程序,我使用信号/插槽机制在 2 个线程之间进行交互。第一个线程运行 UI/TreeWidget,第二个线程运行框架
我在一项操作上遇到了问题。
在 UI 方面,在开始我的操作之前,我将连接 UI 和框架之间的信号/插槽,如下面的 treewidget.cpp 中
connect(&m_Framework, &Framework::RequestIfNameExist, this, &TreeWidget::RequestIfNameExist);
connect(this, &TreeWidget::SendAnswerIfNameExist, &m_Framework, &Framework::NotifIfNameExist);
框架,启动并发送RequestIfNameExist:
emit RequestIfNameExist(tmpname, item, fileInfo.isDir());
while(WaitingResponse == false){
usleep(200);
}
我添加了一个循环,因为我需要等待反馈。奇怪的是,在treewidget.cpp中,我从来没有进入过
void TreeWidget::RequestIfNameExist(QString name, TreeWidgetItem *parent, bool isFolder) {
#ifdef PULS_LOG
QLOG_INFO() << "[TreeWidget] [RequestIfNameExist] ";
#endif
emit SendAnswerIfNameExist(isNameExist(name, parent), isFolder);
}
我从不访问 TreeWidget 中的 RequestIfNameExist,但发出了信号。
我还在框架中放了一个while循环来等待TreeWidget的反馈
void Framework::NotifIfNameExist(QTreeWidgetItem *item, bool isFolder){
if(item != NULL)
item->isFolder = isFolder;
WaitingResponse = true;
}
知道为什么框架发出的信号从未到达 treewidget 吗?它是从一会儿来的吗??
有没有办法不使用while比如“等待事件”+超时
谢谢
【问题讨论】:
-
框架线程正在运行while循环,所以它无法执行
NotifIfNameExist。让框架查询 UI 元素(如 Treewidget)很奇怪。通常 UI 会查询类似框架的后端来获取数据和 UI 状态。 -
我想你想
connect每个信号的信号类中的信号和槽。
标签: c++ multithreading qt5 signals-slots