qt信号槽回主线程,发信号后槽函数不执行

麻子来了 2019-07-12 07:59:18
利用qt的qthread新建线程处理数据,处理完成后,再利用构造函数中的QT信号与槽返回conne(queuedconnection)ct主线程。但是信号发出后,槽函数不执行!
...全文
1706 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
wzscn 2019-08-08
  • 打赏
  • 举报
回复 1
建议使用connect(this,SIGNAL(Signal()),this,SLOT(AfterFunc()),Qt::DriectConnection);
或者connect(this,SIGNAL(Signal()),this,SLOT(AfterFunc()),Qt::BlockingQueuedConnection);

QueuedConnection不会阻塞当前线程,有可能槽函数还来不及执行你的Thread就已经结束了。
浮一大白开水 2019-07-17
  • 打赏
  • 举报
回复
引用 14 楼 麻子来了 的回复:
[quote=引用 10 楼 hzh_Beyond的回复:]另外run中需要阻塞,不阻塞会直接退出线程,还怎么调用?
为什么不阻塞会退出?[/quote] 大概明白你的做法,子线程处理完成,信号发送给主线程然后退出子线程,你在使用子线程的时候应该是new一个,线程结束后delete是吗?你尝试一下在子线程发送信号后qsleep(100), 休眠100ms看看能不能解决有时候可以有时候不行的问题。
待续_1006 2019-07-17
  • 打赏
  • 举报
回复
new完线程对象以后,调用start方法了吗?
走好每一步 2019-07-16
  • 打赏
  • 举报
回复
2楼帖子能搞定的事,你非要拖。。
源码有什么值钱的业务吗。。。。。。
走好每一步 2019-07-16
  • 打赏
  • 举报
回复
直接看官方例子,参考写就可以了。


要么把你完整代码贴出来,你贴一半,让别人怎么帮你?
麻子来了 2019-07-16
  • 打赏
  • 举报
回复
引用 6 楼 csdnwingwu的回复:
对你的信号接收者调用下面的函数, 并启动线程 thread->start() receiver->moveToThread(thread);
有thread->start(); 调用receiver->moveToThread(thread);?
麻子来了 2019-07-16
  • 打赏
  • 举报
回复
引用 10 楼 hzh_Beyond的回复:
另外run中需要阻塞,不阻塞会直接退出线程,还怎么调用?
为什么不阻塞会退出?
麻子来了 2019-07-16
  • 打赏
  • 举报
回复
引用 12 楼 走好每一步的回复:
建议楼主学习下win32编程 推荐书籍 windows核心编程 老外写的 windows程序设计 王艳 张铮
非常感谢您的例子,我会努力继续学习这方面的知识。另外我想知道我的代码错在哪里?也不是一直回不到主线程,有时候可以有时候不行。我想的是辅助线程执行完毕耗时操作,发信号到主线程(槽函数)
走好每一步 2019-07-15
  • 打赏
  • 举报
回复
建议楼主学习下win32编程 推荐书籍 windows核心编程 老外写的 windows程序设计 王艳 张铮
走好每一步 2019-07-15
  • 打赏
  • 举报
回复
引用 9 楼 hzh_Beyond 的回复:
在Run中调用 connect(this,SIGNAL(Signal()),this,SLOT(AfterFunc()),Qt::QueuedConnection);
不需要在run中connect的,也不一定要阻塞的。 还是参考官方例子好。
浮一大白开水 2019-07-15
  • 打赏
  • 举报
回复
另外run中需要阻塞,不阻塞会直接退出线程,还怎么调用?
浮一大白开水 2019-07-15
  • 打赏
  • 举报
回复
在Run中调用 connect(this,SIGNAL(Signal()),this,SLOT(AfterFunc()),Qt::QueuedConnection);
走好每一步 2019-07-15
  • 打赏
  • 举报
回复
学会使用QT Creator里的帮助文档
走好每一步 2019-07-15
  • 打赏
  • 举报
回复
class WorkerThread : public QThread
  {
      Q_OBJECT
      void run() override {
          QString result;
          /* ... here is the expensive or blocking operation ... */
          emit resultReady(result);
      }
  signals:
      void resultReady(const QString &s);
  };

  void MyObject::startWorkInAThread()
  {
      WorkerThread *workerThread = new WorkerThread(this);
      connect(workerThread, &WorkerThread::resultReady, this, &MyObject::handleResults);
      connect(workerThread, &WorkerThread::finished, workerThread, &QObject::deleteLater);
      workerThread->start();
  }
csdnwingwu 2019-07-15
  • 打赏
  • 举报
回复
对你的信号接收者调用下面的函数, 并启动线程 thread->start() receiver->moveToThread(thread);
走好每一步 2019-07-14
  • 打赏
  • 举报
回复
run进去了没,完整代码有吗?

.h
.cpp

都贴出来吧


你可以参考下QThread文档(QT自带的文档)
麻子来了 2019-07-14
  • 打赏
  • 举报
回复
ThreadFunc::ThreadFunc(QObject* parent):
QThread(parent)
{
connect(this,SIGNAL(Signal()),this,SLOT(AfterFunc()),Qt::QueuedConnection);
}

ThreadFunc::~ThreadFunc()
{
Release();
}

void ThreadFunc::run()
{
//..............
emit Signal();//信号
}

void ThreadFunc::AfterFunc()//槽函数
{//进不来??
//......................
}




引用 3 楼 走好每一步 的回复:
[quote=引用 2 楼 麻子来了 的回复:]
[quote=引用 1 楼 走好每一步的回复:]你参数是不是自己定义的?
如果是自己定义的,需要注册一下

不是自己定义的,不用传参数[/quote]

代码给出来吧[/quote]
走好每一步 2019-07-13
  • 打赏
  • 举报
回复
引用 2 楼 麻子来了 的回复:
[quote=引用 1 楼 走好每一步的回复:]你参数是不是自己定义的?
如果是自己定义的,需要注册一下

不是自己定义的,不用传参数[/quote]

代码给出来吧
麻子来了 2019-07-13
  • 打赏
  • 举报
回复
引用 1 楼 走好每一步的回复:
你参数是不是自己定义的? 如果是自己定义的,需要注册一下
不是自己定义的,不用传参数
走好每一步 2019-07-13
  • 打赏
  • 举报
回复
你参数是不是自己定义的? 如果是自己定义的,需要注册一下

16,213

社区成员

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

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