• 4976阅读
  • 6回复

[提问]QObject的派生类方法实现多线程死循环问题 [复制链接]

上一主题 下一主题
离线maidisula
 

只看楼主 倒序阅读 楼主  发表于: 2012-08-17
代码,借用dbzhang800老师的代码,我修改了点
问题
因为slot里是一个死循环函数,所以当发送 dummy.emitsig2()的时候,
slot2槽函数一直没有执行,只有第一个槽slot执行完成后,slot2槽才能执行

那么如果我想在slot里执行完i += 5;阻塞后,马上通过slot2执行i -= 10;然后得出i值为-5,
但是现在却实现不了,只有slot执行完成,才会去执行slot2,那么我该怎么办呢?

因为slot和slot2是在同一个线程里执行的,那么我怎么才能使slot2执行在与主线程和slot线程不同的线程里呢?

怎样才能实现多个线程同时修改一个变量这种方式呢?


谢谢大家

#include <QtCore/QCoreApplication>
#include <QtCore/QObject>
#include <QtCore/QThread>
#include <QtCore/QDebug>

class Dummy:public QObject
{
    Q_OBJECT
public:
    Dummy(QObject* parent=0):QObject(parent)     {}
public slots:
    void emitsig()
    {
        emit sig();
    }

    void emitsig2()
    {
        emit sig2();
    }
signals:
    void sig();
    void sig2();
};

class Object:public QObject
{
    Q_OBJECT
public:
    Object(){i = 0;}
    int i;
public slots:
    void slot()
    {
        qDebug()<<"from thread slot:" <<QThread::currentThreadId();
         i += 5;
            while(1)//死循环,阻塞线程
            {

            }

    }

    void slot2()
    {
        i-= 10;
        qDebug()<<"from thread slot2:" <<QThread::currentThreadId();
    }
};

#include "main.moc"

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    qDebug()<<"main thread:"<<QThread::currentThreadId();
    QThread thread;
    Object obj;
    Dummy dummy;
    obj.moveToThread(&thread);
    QObject::connect(&dummy, SIGNAL(sig()), &obj, SLOT(slot()));
    thread.start();
    dummy.emitsig();

     QObject::connect(&dummy, SIGNAL(sig2()), &obj, SLOT(slot2()));
     dummy.emitsig2();
    return a.exec();
}



离线maidisula

只看该作者 1楼 发表于: 2012-08-17
有遇到过这样的问题的吗?
离线maidisula

只看该作者 2楼 发表于: 2012-08-20
我来顶一下
离线stu_xk

只看该作者 3楼 发表于: 2012-08-20
创建2个线程
离线maidisula

只看该作者 4楼 发表于: 2012-08-20
回 3楼(stu_xk) 的帖子
如果再创建一个线程,那就要创建一个继承qobject的类,那么这类里怎样修改上一个类中的变量呢?
除非让新的类里使用上一类的指针。

还有更好的方法吗?
离线stu_xk

只看该作者 5楼 发表于: 2012-08-20
回 4楼(maidisula) 的帖子
int a;
class Thread_A : public QThread
{
}

class Thread_B : public QThread
{
}
或者Thread_A执行完后发个信号给Thread_B触发slot2,建议你看看生产者消费者那个qt例子
离线maidisula

只看该作者 6楼 发表于: 2012-08-20
线程A已经在死循环中,所以使用其它线程通知线程A应该不行。
快速回复
限100 字节
 
上一个 下一个