Qt线程的用法问题

大卫无限 2015-06-15 06:03:32
先看代码



class MyThread : public QThread
{
Q_OBJECT
public:
MyThread();
~MyThread();
void Something();

public slots:
void OnSomething();
};

MyThread::MyThread()
{
this->start();
this->moveToThread(this);
}

MyThread::~MyThread()
{
this->exit();
for (int i = 0; i < 10 && this->isRunning(); ++i)
{
this->wait(1);
}
}

void MyThread::Something()
{
QMetaObject::invokeMethod(this, "OnSomething", Qt::QueuedConnection);
}

void MyThread::OnSomething()
{
}



这里提出的是关于moveToThread(this);的问题.
其实我看过别人发的帖子说,moveToThread(this)是错误的,观点是大概是这样的,thread主要是操作线程的, 而不是为了用来让某段代码在这个线程中运行的(不知道转述的有没有误,说实话,我也不是很明白说了些什么). 当然这只是一面之词.

个人觉得其实这样写并没有什么太大的问题.只是让之前函数式的线程变成了基本类的线程,这样好像方便不少.

同志们对此有什么看法吗,这个东西是错的,是对的,还是看个人理解?

...全文
149 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
csdnbuku 2015-06-19
  • 打赏
  • 举报
回复
引用 5 楼 n7zj0x8 的回复:
[quote=引用 3 楼 csdnbuku 的回复:] 新手请教个线程的问题。 主窗口弹出子窗口,比如 一个曲线图。 主窗口数据不断发生变化。通过信号槽传到子窗口,同步更新曲线图。 不用线程,必然很卡,如果用线程,直接用moveToThread(this)这种方法可行吗? 网上也找过使用线程的方法,不过还是很卡顿。不知道怎么处理好。
还有就是可以不用线程,主窗口到子窗口,不直接调用函数,全用信号和槽来连接,连接的时候使用Qt::QueuedConnection参数,就可以把通知子窗口更新的消息放到队列里面,这样应该不会卡了,但是也会出现,更新不及时的情况[/quote] 试了下还真是不同步更新。虽然不卡 ,主窗口数据变化结束,子窗口的曲线图还在变化。一会儿才结束,如果想要同步更新应该怎么办呢。
大卫无限 2015-06-17
  • 打赏
  • 举报
回复
引用 3 楼 csdnbuku 的回复:
新手请教个线程的问题。 主窗口弹出子窗口,比如 一个曲线图。 主窗口数据不断发生变化。通过信号槽传到子窗口,同步更新曲线图。 不用线程,必然很卡,如果用线程,直接用moveToThread(this)这种方法可行吗? 网上也找过使用线程的方法,不过还是很卡顿。不知道怎么处理好。
还有就是可以不用线程,主窗口到子窗口,不直接调用函数,全用信号和槽来连接,连接的时候使用Qt::QueuedConnection参数,就可以把通知子窗口更新的消息放到队列里面,这样应该不会卡了,但是也会出现,更新不及时的情况
大卫无限 2015-06-17
  • 打赏
  • 举报
回复
引用 3 楼 csdnbuku 的回复:
新手请教个线程的问题。 主窗口弹出子窗口,比如 一个曲线图。 主窗口数据不断发生变化。通过信号槽传到子窗口,同步更新曲线图。 不用线程,必然很卡,如果用线程,直接用moveToThread(this)这种方法可行吗? 网上也找过使用线程的方法,不过还是很卡顿。不知道怎么处理好。
界面必须在主线程里面,不能移动到其它的线程里面去.主窗口->线程类->子窗口,这样是可行的.但是这样就是异步的,也就是说,主窗口更新了,子窗口可能还没有来得及更新.
大卫无限 2015-06-16
  • 打赏
  • 举报
回复
感谢发表观点.
引用 1 楼 foruok 的回复:
很奇怪的用法,QThread对象属于它所在的线程,它start起来的是另一个线程。看不出让母鸡钻进它生的蛋里的意义。
其实这个用法,要是使用了的话,确实会觉得它挺方便的,但是看上去可能有点诡异. 之前看到一些开源项目,也有这种写法. 在构造函数里面启动线程,然后在析构函数里面停掉它,构造函数和析构函数都一般是在主线程里面.这个线程对象一被创建出来就剥离掉了,创建它的线程只保留了它的一个引用. 这样封装之后,不必去管线程的启动和停止问题.使用的时候new一下,把信号和槽挂上,它就可以工作了.使用它就像是一个普通的对象. 不用的时候直接 delete,由于事件循环自动处理了线程访问冲突的问题,所以不用关心加锁的问题.不过它是异步的,不能主动去访问它的数据,只能让这个线程用信号抛出来. 如果要使用同步的模式,就不能这样写.而真正做事的函数都是用Qt::QueuedConnection的方式来触发,会被放到这个线程里面操作. 所以其实我觉得它更像是,母鸡生了一个蛋,这个蛋又长成了一只鸡, 然后这两个鸡之间就用说话的方式进行交流,这里的话,就好比是信号和槽(QueuedConnection方式连接的信号槽). 感觉我之间的观点不同只是对它的一个理解问题,其实提出来讨论,我更担心是这种方式代码上是不是有潜在的错误.
csdnbuku 2015-06-16
  • 打赏
  • 举报
回复
新手请教个线程的问题。 主窗口弹出子窗口,比如 一个曲线图。 主窗口数据不断发生变化。通过信号槽传到子窗口,同步更新曲线图。 不用线程,必然很卡,如果用线程,直接用moveToThread(this)这种方法可行吗? 网上也找过使用线程的方法,不过还是很卡顿。不知道怎么处理好。
foruok 2015-06-15
  • 打赏
  • 举报
回复
很奇怪的用法,QThread对象属于它所在的线程,它start起来的是另一个线程。看不出让母鸡钻进它生的蛋里的意义。

16,213

社区成员

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

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