两个线程同时调用loop.exec可以正确执行吗?



  • MyClass
    {
    void func1();
    void func2();
    }

    void MyClass::func1()
    {
    QUrl url("www.site1.com");
    QNetworkRequest requete(url);
    QNetworkAccessManager m_pNetManager = new QNetworkAccessManager;
    QNetworkReply* reponse = m_pNetManager->post(requete, postData.toString(QUrl::FullyEncoded).toUtf8());

    QEventLoop loop;
    connect(reponse, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
    QString strReply = QString::fromUtf8(reponse->readAll());
    qDebug() << strReply;
    

    }

    void MyClass::func2()
    {
    QUrl url("www.site2.com");
    QNetworkRequest requete(url);
    QNetworkAccessManager m_pNetManager = new QNetworkAccessManager;
    QNetworkReply* reponse = m_pNetManager->post(requete, postData.toString(QUrl::FullyEncoded).toUtf8());

    QEventLoop loop;
    connect(reponse, SIGNAL(finished()), &loop, SLOT(quit()));
    loop.exec();
    QString strReply = QString::fromUtf8(reponse->readAll());
    qDebug() << strReply;
    

    }

    问题1:在两个线程里分别生成MyClass的两个对象,分别调用myobject1.func1()和myobject2.func2()是不是互不干扰?
    问题2:如果只有一个MyClass对象呢,两个线程分别调用myobject1.func1()和myobject1.func2()会不会相互干扰?
    问这个问题的原因是,虽然对象和函数都是独立的,但事件系统毕竟只有一个,当func1的loop.exec正在执行的时候,func2的还能正确执行loop.exec吗?说到底,是对Qt的事件机制还不够了解。谢谢指教!



  • 问题3:每个线程各有一个事件循环, 但是当我调用func1的时候,它的loop是否就是线程的loop呢?
    问题4:当线程1调用myobject1.func1的时候,正在执行loop.exec,但此时线程2也要执行myobject1的func2,它试图执行loop.exec,但此时线程1的loop.exec尚未执行完毕,那么线程2会卡在这里等待线程1的Loop.exec执行完毕呢,还是线程2直接执行func2的loop.exec互不影响?如果线程1和线程2,同一时刻执行的是同一个对象myobject的func1和func2函数,是直接崩溃,还是第二个线程需要等待前一个func1的loop.exec的结束,还是会直接执行func2的Loop.exec互不影响?



  • @stlcours
    回答一:两个不会互相干扰的。因为这是分别的线程,线程中执行分别的事件循环,彼此通过获取网络的数据,不构成互相干扰。
    回答二:只有一个对象的话,也不会互相干扰。因为两个函数没有调用数据成员。也就是说这两个函数是可重入的。

    回答三:线程内部的循环,本质上即一个while结构。因此,func1还是func2的循环就是线程的循环。
    回答四:互不影响,互不影响。线程在操作可重入函数的时候,是相对独立的。


Log in to reply
 

走马观花

最近的回复

  • 诶 没有Linux吗??

    read more
  • 萌梦 男孩,女孩,和蛋

    menghome.png

    read more
  • 设计模式-工厂模式

    使用qt/qml来演示设计模式效果,便于学习理解

    1)定义创建对象的接口,封装对象的创建
    2)使具体化类的工作延迟到工厂子类中

    bg.png
    image.png

    1. 工厂类

    createProduct使用了参数来选择要创建哪个产品

    #ifndef FACTORY_H #define FACTORY_H #include <QObject> class Product; class QString; class Factory: public QObject { Q_OBJECT public: virtual ~Factory() = 0; virtual Product* createProduct(QString type) = 0; protected: Factory(); }; class ConcreteFactory: public Factory { Q_OBJECT public: ~ConcreteFactory(); ConcreteFactory(); public slots: Product* createProduct(QString type); }; #endif // FACTORY_H #include "factory.h" #include "product.h" #include <QtQml/qqml.h> Factory::~Factory() { } Factory::Factory() { qmlRegisterType<Product>("Product", 1, 0, "Product"); } ConcreteFactory::~ConcreteFactory() { } ConcreteFactory::ConcreteFactory() { } Product *ConcreteFactory::createProduct(QString type) { if(type == "boy") return static_cast<Product *>(new ConcreteProduct1()); else if(type == "girl") return static_cast<Product *>(new ConcreteProduct2()); return static_cast<Product *>(new ConcreteProduct1()); } 2 产品类

    一个产品是萌梦男,一个产品是萌梦女

    #ifndef PRODUCT_H #define PRODUCT_H #include <QObject> class Product: public QObject { Q_OBJECT public: virtual ~Product() = 0; Q_PROPERTY(QString icon READ icon NOTIFY iconChanged) QString m_icon; QString icon() const { return m_icon; } signals: void iconChanged(QString icon); protected: Product(); signals: public slots: }; class ConcreteProduct1: public Product { Q_OBJECT public: ~ConcreteProduct1(); ConcreteProduct1(); }; class ConcreteProduct2: public Product { Q_OBJECT public: ~ConcreteProduct2(); ConcreteProduct2(); }; #endif // PRODUCT_H #include "product.h" Product::~Product() { } Product::Product() { } ConcreteProduct1::~ConcreteProduct1() { } ConcreteProduct1::ConcreteProduct1() { m_icon = "qrc:/images/boy.png"; } ConcreteProduct2::~ConcreteProduct2() { } ConcreteProduct2::ConcreteProduct2() { m_icon = "qrc:/images/girl.png"; } 3. main.qml

    使用timer,canvas,listview等实现一个自动化生产的动画效果

    源代码

    Fork me on Gitee

    read more
  • blender建模 章鱼
    捕获2.PNG 😵

    read more

关注我们

微博
QQ群