• 7259阅读
  • 7回复

请教QThread 类 [复制链接]

上一主题 下一主题
离线losemyheaven
 
只看楼主 倒序阅读 楼主  发表于: 2011-02-11
— 本帖被 XChinux 从 Qt基础编程 移动到本区(2011-02-12) —
我在看QThread manual的时候   看到这样一段代码
class MyThread : public QThread
{
public:
     void run();
};

void MyThread::run()
{
     QTcpSocket socket;
     // connect QTcpSocket's signals somewhere meaningful
     ...
     socket.connectToHost(hostName, portNumber);
     exec();
}
这段代码是QThread   中的 Detailed Description中的应用举例, 其中那个run方法中的exec(), manual中写的是进入事件循环,写的太笼统,麻烦高手解释下

另外我写过一个测试代码
#include <QThread>
class TestThread : public QThread
{
public:
    TestThread();
public:
    void run();
};

TestThread::TestThread()
{}

void TestThread::run()
{
    while(1){
        this->msleep(1000);
        qDebug("12345");
       this->exec();
    }
}

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    TestThread *test = new TestThread();
    test->start();
    return a.exec();
}
这段代码如果在run方法中不加exec这句就可以正常执行(每隔一秒就输出12345),但是如果有exec那句就不行,只输出一次就完了, 我想问下那个exec到底是干吗的? 麻烦高手解释
离线引子
只看该作者 1楼 发表于: 2011-02-11
void TestThread::run()
{
    while(1){
        this->msleep(1000);
        qDebug("12345");
       this->exec();
    }
}
从this->exec()这里进入事件循环就回不来了,不会继续执行下面的语句了,所以这个while死循环只执行了一次
步子大了扯着蛋!
离线XChinux

只看该作者 2楼 发表于: 2011-02-11
exec()里处理消息,这时,你的各种信号、消息等都能正常处理,如果exec结束,意味着你的这个线程也执行结束了。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线XChinux

只看该作者 3楼 发表于: 2011-02-11
如果不调用exec(),那就没法处理信号、消息,明白了吗?如果你的线程执行任务不需要这些,那就大可不需要调用exec(),直接执行你的任务执行完毕retutrn就行了。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线losemyheaven
只看该作者 4楼 发表于: 2011-02-12
我想请问下  如果我现在想实现一个线程 , 这个线程既可以emit一个信号,又可以拥有槽,又可以不断的重复做一件事情,这样可以么??  
比如这样一个功能的线程 :
不断输出“12345”, 当输出的次数为5的整数倍时,emit一个信号。 这个线程又可以有一个槽,这个槽被触发一次就会输出一次“11111”, 这个线程可以实现么?
那个exec()就卡死到那里了,怎么实现让他能既能处理信号和槽又可以往复干一件事情呢?
请指教,谢谢!

另外请教一下使用quit()或者terminate()函数来结束线程安全么? 最安全的结束一个线程的方法是什么??
谢谢你能详细的回答我的问题
离线XChinux

只看该作者 5楼 发表于: 2011-02-12
int _inc;

run()
{
    connect(this, SIGNAL(sig1()), parentWidget, SLOT(onSig1()));
    connect(parentWidget, SIGNAL(sig2()), this, SLOT(onSIg2()));
   _inc = 0;
   QTimer::singleShot(0, this, SLOT(func1()));
    exec();
}

void func1()
{
    if (_inc % 5 == 0)
   {
      emit sig1();
   }
   _inc++;
  QTimer::singleShot(0, this, SLOT(func1()));
}

void onSig2()
{
    // 输出 "111111";
}


二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线losemyheaven
只看该作者 6楼 发表于: 2011-02-13
谢谢版主了~~!!!

另外请教一下使用quit()或者terminate()函数来结束线程安全么? 最安全的结束一个线程的方法是什么??
[ 此帖被losemyheaven在2011-02-13 18:47重新编辑 ]
离线losemyheaven
只看该作者 7楼 发表于: 2011-02-13
回 5楼(XChinux) 的帖子
谢谢版主了~~!!!

另外请教一下使用quit()或者terminate()函数来结束线程安全么? 最安全的结束一个线程的方法是什么??
快速回复
限100 字节
 
上一个 下一个