qt中进程与线程通信的问题

wsgsf 2014-11-18 04:41:08
qt中进程下开了A,B,C3个线程,我想让进程给A发一个信号,让其运行A中的一个函数,请问用什么方式比较好
...全文
230 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
大卫无限 2014-11-20
  • 打赏
  • 举报
回复
Qt的线程是基于对象的.不知道你是不是这样做的,如果你是使用的传统意义的函数式的线程,我可能帮不上你. 你这里的"进程给A发一个信号",我可以理解为其它的线程或者主线程吧. 假设A,B,C线程基于对象ObjA,ObjB,ObjC.

#include <QObject>
#include <QThread>
#include <QDebug>

class ObjA : public QObject
{
Q_OBJECT
ObjA ()
{
    /// 以下方式二选一.不要使用继承QThread重写run函数,这样你的和传统的线程一样的.函数式的线程.
    //这里如果ObjA是继承自QThread,那么使用
    this->moveToThread(this);
    this->start();

    //这里如果不是继承自QThread,而是基于QObject,那么可以这样
    m_pQThread = new QThread();
    this->moveToThread(m_pQThread);
    m_pQThread->start();
}


public slots:
void AFun()
{
    qDebug() << "AFun:" << QThread::currentThreadId ();
}

private:
    QThread *m_pQThread;
}



class ObjB : public QObject
{
Q_OBJECT
public:
    //在b中异步调用ObjA::AFunc();
    ObjB ()
    {
        //首先需要有ObjA 的指针吧.
        ObjA *obja = ....;
        //其次,你需要有一个信号来出发ObjA里面的槽函数,因为Qt基于对象的线程是使用信号槽实现的.
        connect(this, SIGNAL(DoCallAFunc()),
                        obja, SLOT(AFun(), Qt::QueuedConnection);
        //最后调用信号触发函数.到这里,不管你是在什么地方调用的,信号,AFun()都会在它自己的线程里面被调用.
        emit DoCallAFunc();
        //这里可以对比一下,两个地方的线程ID肯定是不一样的.这里不能直接调用AFun();,一定要用信号触发.
        qDebug() << "ObjB :" << QThread::currentThreadId ();
    }

signals:
    void DoCallAFunc();

public slots:
void BFun()
{
}
}

foruok 2014-11-18
  • 打赏
  • 举报
回复
自定义事件、跨线程的信号与槽

16,199

社区成员

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

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