我正在设计一个在本地网络中执行ARP扫描的Qt应用程序。我这里有我的线程类(伪代码):
class worker:public QThread
{
run()
{
.......some code;
.......some code;
}
slot function1()
{
.......some code;
sleep(5);
.......some code;
}
slot function2()
{
.......some code;
.......some code;
}
}
我知道sleep函数会在一段时间内阻塞它自己的调用者,但是,上面function1中的sleep函数是否会阻塞其他两个因为它们属于一个QThread对象? Function1和function2是仅由连接信号触发的插槽。
谢谢!
答案 0 :(得分:2)
你问题的简单答案是肯定的,在那种情况下调用sleep会阻塞线程,因此会阻止线程消息循环中的消息被处理。
你遇到的部分问题是,除非你想重新编写Qt如何处理线程的代码,否则你不应该继承QThread。 "You're doing it wrong!"
你应该做的是创建从QObject派生的worker对象并将它们移动到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();
通过这种方式,您可以创建多个工作对象并将其中的任意数量移动到新线程,而不是坚持每个工作对象的新线程。如果您创建的线程数多于可用的处理器核心数,那么您将无法使用这些额外的线程。
您可以阅读有关how to use QThreads here的更多信息。
最后,如果你不得不在线程中调用sleep,那么也许你的设计是错误的。如果您想等待,可能使用QMutex将是更好的选择。
答案 1 :(得分:0)
答案取决于连接类型。如果在同一线程拥有的两个对象之间建立连接,则它们将不是并发的。如果在不同线程上创建的两个对象之间建立连接,则它们可以是并发的。