关于Qt 线程多线程的问题

Cirfe 2015-01-31 07:08:31
先贴代码

class Thread:public QThread
{
public slot:
void onTimeout()
{
qDebug()<<"Thread::onTimeout get called from :"<<currentThread();
}
private:
void run()
{
QTimer timer;
connect(&timer,SIGNAL(timeout()),this,SLOT(onTimeout()));
timer.start(1000);
exec();
}
}

main.cpp

int main(int argc, char *argv[])
{
QTimer timer;
timer.start(5000);
Thread t;
t.start();
QObject::connect(&t,SIGNAL(finished()),&t,SLOT(deleteLater()));
QObject::connect(&timer,SIGNAL(timeout()),&t,SLOT(quit()));
return a.exec();
}



两个问题,一个是为什么Thread类中的onTimeout()槽函数打印的结果是在主线程,而不是子线程?
两一个问题,如果main函数,像我上边那样写两个connect()操作,会造成程序崩溃,这是为什么?


请教大神指导
...全文
168 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Cirfe 2015-02-01
  • 打赏
  • 举报
回复
引用 6 楼 dbzhang800 的回复:
[quote=引用 5 楼 l108103t 的回复:] [quote=引用 4 楼 dbzhang800 的回复:] [quote=引用 2 楼 l108103t 的回复:] 第二个问题已经明白了,第一个问题,我正是看了您发的连接才有的这个疑问。原文章中并没有给出原因分析啊,难道我没看见?还请指点
简单地说,queue方式的信号槽借助的就是Qt的事件系统:信号被转换成一个event,而该event被post到你的slot对象。 而多线程下事件系统的理解的关键就是 QObject对象的线程关联性。即,你往某一个对象post一个event,该event会在哪一个线程被处理。[/quote] 老实说,没太明白您这两句话的意思。。。 run函数中的timer,所在的不正是work 线程中么?为什么他发出信号,槽函数会在主线程中调用?[/quote] 首先,QThread是一个QObject对象,它关联的线程是 主线程,而不是它所管理的次线程!! 如果你往该QThread post一个event,该event必然会进主线程的事件队列,而后在主线程被处理。[/quote] 还有一个其他的问题请教,如果采用movetothread的方式。 例如。

SomeClass *a=new SomeClass;
QThread *b=new QThread;
a->movetothread(b);
b->start();
假设a中有一些槽函数。问题是我如何终止a的运行?,是不是直接调用b.quit();就可以了?如果想析构b,是不是在调用quit函数之后再继续调用deletelater?那a什么时候析构?是需要手动析构还是b终止后就直接调用了a的析构函数。 问题有点多,最近看的感觉脑子越来越乱,提前谢谢您的耐心解答。
dbzhang800 2015-02-01
  • 打赏
  • 举报
回复
引用 5 楼 l108103t 的回复:
[quote=引用 4 楼 dbzhang800 的回复:] [quote=引用 2 楼 l108103t 的回复:] 第二个问题已经明白了,第一个问题,我正是看了您发的连接才有的这个疑问。原文章中并没有给出原因分析啊,难道我没看见?还请指点
简单地说,queue方式的信号槽借助的就是Qt的事件系统:信号被转换成一个event,而该event被post到你的slot对象。 而多线程下事件系统的理解的关键就是 QObject对象的线程关联性。即,你往某一个对象post一个event,该event会在哪一个线程被处理。[/quote] 老实说,没太明白您这两句话的意思。。。 run函数中的timer,所在的不正是work 线程中么?为什么他发出信号,槽函数会在主线程中调用?[/quote] 首先,QThread是一个QObject对象,它关联的线程是 主线程,而不是它所管理的次线程!! 如果你往该QThread post一个event,该event必然会进主线程的事件队列,而后在主线程被处理。
Cirfe 2015-02-01
  • 打赏
  • 举报
回复
引用 4 楼 dbzhang800 的回复:
[quote=引用 2 楼 l108103t 的回复:] 第二个问题已经明白了,第一个问题,我正是看了您发的连接才有的这个疑问。原文章中并没有给出原因分析啊,难道我没看见?还请指点
简单地说,queue方式的信号槽借助的就是Qt的事件系统:信号被转换成一个event,而该event被post到你的slot对象。 而多线程下事件系统的理解的关键就是 QObject对象的线程关联性。即,你往某一个对象post一个event,该event会在哪一个线程被处理。[/quote] 老实说,没太明白您这两句话的意思。。。 run函数中的timer,所在的不正是work 线程中么?为什么他发出信号,槽函数会在主线程中调用?
dbzhang800 2015-02-01
  • 打赏
  • 举报
回复
引用 2 楼 l108103t 的回复:
第二个问题已经明白了,第一个问题,我正是看了您发的连接才有的这个疑问。原文章中并没有给出原因分析啊,难道我没看见?还请指点
简单地说,queue方式的信号槽借助的就是Qt的事件系统:信号被转换成一个event,而该event被post到你的slot对象。 而多线程下事件系统的理解的关键就是 QObject对象的线程关联性。即,你往某一个对象post一个event,该event会在哪一个线程被处理。
Cirfe 2015-01-31
  • 打赏
  • 举报
回复
引用 1 楼 dbzhang800 的回复:
第一个问题,属于QThread典型的错误用法。你可以看看 http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/ 第二个问题,属于C++基础问题。你见过下面这种写法么? Thread t; delete &t;
你是原文的作者对不对!!!我还在下边给您留言了,cirfe那个就是。膜拜大神
Cirfe 2015-01-31
  • 打赏
  • 举报
回复
引用 1 楼 dbzhang800 的回复:
第一个问题,属于QThread典型的错误用法。你可以看看 http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/ 第二个问题,属于C++基础问题。你见过下面这种写法么? Thread t; delete &t;
引用 1 楼 dbzhang800 的回复:
第一个问题,属于QThread典型的错误用法。你可以看看 http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/ 第二个问题,属于C++基础问题。你见过下面这种写法么? Thread t; delete &t;
第二个问题已经明白了,第一个问题,我正是看了您发的连接才有的这个疑问。原文章中并没有给出原因分析啊,难道我没看见?还请指点
dbzhang800 2015-01-31
  • 打赏
  • 举报
回复
第一个问题,属于QThread典型的错误用法。你可以看看 http://blog.debao.me/2013/08/how-to-use-qthread-in-the-right-way-part-1/ 第二个问题,属于C++基础问题。你见过下面这种写法么? Thread t; delete &t;

16,214

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧