可以在一个QThread对象内同时运行槽函数
Can slot functions inside one QThread object run concurrently?
我正在设计一个Qt应用程序,它在本地网络中执行ARP扫描。我在这里有我的线程类(伪代码):
class worker:public QThread
{
run()
{
.......some code;
.......some code;
}
slot function1()
{
.......some code;
sleep(5);
.......some code;
}
slot function2()
{
.......some code;
.......some code;
}
}
我知道sleep函数会在一定的时间内阻止它自己的调用者,但是,上面函数1中的sleep函数是否也会阻止其他两个,因为它们属于一个QThread对象?功能1和功能2是仅由连接的信号触发的插槽。
谢谢!
问题的简单答案是肯定的,在这种情况下调用sleep将阻塞线程,从而阻止线程消息循环中的消息被处理。
您遇到的部分问题源于这样一个事实,即除非您想重写Qt如何处理线程的代码,否则不应该继承QThread。"你做错了!"
您应该做的是创建从QObject派生的工作对象,并将它们移动到QThread:-
class WorkerObject : public QObject
{
Q_OBJECT
public:
WorkerObject(QObject* parent = NULL);
private:
private slots:
void DoWork();
};
QThread* thread = new QThread;
WorkerObject* worker = new WorkerObject(parent);
worker->moveToThread(thread);
// Qt 5 connect syntax
connect(thread, &QThread::started, worker, &WorkerObject::DoWork);
connect(thread, &QThread::finished, thread, &QThread deleteLater);
thread->start();
通过这种方式,您可以创建多个工作对象,并将任意数量的工作对象移动到新线程,而不是坚持每个工作对象都有一个新线程。如果您创建的线程数量超过了可用处理器内核的数量,那么使用这些额外的线程将不会带来好处。
您可以在这里阅读更多关于如何使用QThreads的信息。
最后,如果您不得不在线程中调用sleep,那么您的设计可能是错误的。如果你想等待,也许使用QMutex会是一个更好的选择。
答案取决于连接类型。如果在同一线程拥有的两个对象之间建立连接,则它们将不会并发。如果在不同线程上创建的两个对象之间建立连接,则它们可以是并发的。
相关文章:
- CMake-按正确顺序将项目与C运行时对象文件链接
- 通过switch和static_cast访问多态对象的运行时类型
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- cout 新创建的对象引发运行时错误
- 在运行时有条件地删除类成员或跳过调用该成员对象的构造函数
- C++,如何根据运行时条件构造引用不同 istream 对象的对象?
- 如何运行一个类的多个对象,该类的函数仅在C++中调用线程?
- 创建 QtChart 对象会在运行时创建EXC_BAD_ACCESS错误
- 如何在运行时在对象数组中动态追加新对象C++并打印它们
- 无法在派生对象上运行虚拟函数
- 从主线程中询问运行对象表 (ROT) 时出错
- 如何在运行时创建和命名对象?
- C++ 在运行时选择一个随机对象
- 在脚本运行后引用 lua 表/对象
- 运行线程和线程对象之间的关系
- 在C++中运行 python 对象
- 在一组模板化对象上运行函数
- 运行程序时找不到共享对象库,但在编译过程中链接了它
- 在运行时 c++ 更改用类对象填充的数组的大小
- 如何使用CPP中使用一个对象运行同一类的两个线程