QThrad通过信号和槽建立2个线程,但随机的只有一个成功

gell-lee 2017-07-21 04:55:01
class workTread : public QThread
{
Q_OBJECT
void run() Q_DECL_OVERRIDE
{
unsigned int arg;
/* ... here is the expensive or blocking operation ... */
emit resultReady(arg);
exec();
}

signals:
void resultReady(unsigned int arg);
};
class onDataRecvSoap;
class dataService :QObject
{
//Q_OBJECT
public:
dataService();
~dataService();
virtual void OnData(ns1__DataNotification *ns1__DataNotification_);

public slots:
void doTask(unsigned int arg);

private:
onDataRecvSoap m_onDataRecv;
workTread *m_dataServiceThread;
};

dataService::dataService()
{
//创建 m_dataServiceThread
m_dataServiceThread = new workTread();
connect(m_dataServiceThread, &workTread::resultReady, this, &dataService::dataServiceTask);
connect(m_dataServiceThread, &workTread::finished, m_dataServiceThread, &QObject::deleteLater);


//创建m_onDataThread
m_onDataThread = new workTread();
connect(m_onDataThread, &workTread::resultReady, this, &dataService::onDataTask);
connect(m_onDataThread, &workTread::finished, m_onDataThread, &QObject::deleteLater);

m_dataServiceThread->start();
m_onDataThread->start();
}

dataService::~dataService()
{
delete m_dataServiceThread;
delete m_onDataThread;
}

void dataService::OnData(ns1__DataNotification *ns1__DataNotification_)
{

}

void dataService::dataServiceTask(unsigned int arg)
{
while (true)
{
Sleep(2000);
std::cout << "dataServiceTask" << std::endl;
}
}

void dataService::onDataTask(unsigned int arg)
{
while (true)
{
Sleep(2000);
std::cout << "onDataTask" << std::endl;
}
}
Main里面
dataService

代码如上所述, 每次运行想建立2个线程,但都是随机onDataTask, dataServiceTask 每次都只调用一个。
...全文
193 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
别逗我乐 2017-07-25
  • 打赏
  • 举报
回复
你的信号槽的while循环,是在主线程中,一旦一个信号被槽函数接收,就是无限循环,主线程就被阻塞了,所以无法响应后续的信号。楼主应该把while循环放到各个线程中, 就是两个线程类 class workTread : public QThread1, class workTread : public QThread2 而不是在dataService中 http://www.cnblogs.com/vegetable/p/6648609.html 也可以使用QObject::moveToThread()创建线程
雲天之巔 2017-07-22
  • 打赏
  • 举报
回复
void dataService::dataServiceTask(unsigned int arg) { while (true) { Sleep(2000); std::cout << "dataServiceTask" << std::endl; } } 你这里的槽函数是在主线程运行的,你这样把主线程阻塞了,另一个线程发来的信号后,槽函数没法运行了。。,

16,212

社区成员

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

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