Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/137.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 一个QThread对象内的插槽函数能否同时运行?_C++_Qt_Qthread - Fatal编程技术网

C++ 一个QThread对象内的插槽函数能否同时运行?

C++ 一个QThread对象内的插槽函数能否同时运行?,c++,qt,qthread,C++,Qt,Qthread,我正在设计一个Qt应用程序,在本地网络中执行ARP扫描。我在这里有我的线程类(伪代码): 我知道sleep函数会在一定时间内阻止它自己的调用者,但是,上面function1中的sleep函数是否也会阻止其他两个调用者,因为它们属于一个QThread对象?功能1和功能2是仅由连接的信号触发的插槽 谢谢 答案取决于连接类型。如果连接是在同一线程拥有的两个对象之间建立的,那么它们将不会并发。如果在不同线程上创建的两个对象之间建立了连接,那么它们可以是并发的。您的问题的简单答案是肯定的,在这种情况下调用

我正在设计一个Qt应用程序,在本地网络中执行ARP扫描。我在这里有我的线程类(伪代码):

我知道sleep函数会在一定时间内阻止它自己的调用者,但是,上面function1中的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();
通过这种方式,您可以创建多个辅助对象,并将任意数量的辅助对象移动到新线程,而不是坚持每个辅助对象都有一个新线程。如果创建的线程数超过了可用的处理器内核数,那么使用这些额外的线程将不会带来好处

你可以阅读更多关于


最后,如果您必须调用线程中的睡眠,那么您的设计可能是错误的。如果您想等待,也许使用将是一个更好的选择。

您不需要一个
worker->moveToThread(线程)某处?否则,
QThread::started
WorkerObject::DoWork
发送信号连接的
QThread::started
是否会被封送回仍与
worker
关联的主线程?还是Qt5改变了一些我不知道的事情?@MichaelBurr,哎呀!当然,我错了。感谢您指出错误,并且发现得很好;O) 我使用子类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();