class A : public QObject{ Q_OBJECTsignals: void sgFromA();public slots: void slotA() { qWarning() << "A::slotA() -> TID = " << QThread::currentThreadId(); emit sgFromA(); }private:};class B: public QObject{ Q_OBJECTpublic slots: void slotB() { qWarning() << "B::slotB() -> TID = " << QThread::currentThreadId(); }private:};class ThA : public QThread{public: A *cA; ThA() { }protected: void run() { qWarning() << "running ThA::run() -> TID = " << QThread::currentThreadId(); cA = new A; forever { sleep(1); cA->slotA(); } }};class ThB : public QThread{public: B *cB; ThB() { }protected: void run() { qWarning() << "running ThB::run() -> TID = " << QThread::currentThreadId(); cB = new B; exec(); }};
int main(int argc, char *argv[]){ QCoreApplication app(argc, argv); //qWarning() << "App TP:" << QThread::currentThread(); qWarning() << "Application -> TID = " << QThread::currentThreadId(); ThA *tA = new ThA; ThB *tB = new ThB; app.connect(tA->cA, SIGNAL(sgFromA()), tB->cB, SLOT(slotB()), Qt::QueuedConnection); tA->start(); tB->start(); return app.exec();}
#ifndef AB_H#define AB_H#include <QThread>#include <QDebug>class A : public QObject{ Q_OBJECTsignals: void sgFromA();public slots: void slotA() { for (int i=0;i<5;++i) { qWarning() << "A::slotA() -> TID = " << QThread::currentThreadId(); emit sgFromA(); } //forever { // qWarning() << "A::slotA() -> TID = " << QThread::currentThreadId(); // emit sgFromA(); //} } void slotA2() { qWarning() << "A::slotA2() -> TID = " << QThread::currentThreadId(); }};class B: public QObject{ Q_OBJECTsignals: void sgFromB();public slots: void slotB() { qWarning() << "B::slotB() -> TID = " << QThread::currentThreadId(); emit sgFromB(); }};class ThA : public QThread{public: A *cA; ThA() { cA = new A; }protected: void run() { qWarning() << "running ThA::run() -> TID = " << QThread::currentThreadId(); cA->slotA(); exec(); }};class ThB : public QThread{public: B *cB; ThB() { cB = new B; }protected: void run() { qWarning() << "running ThB::run() -> TID = " << QThread::currentThreadId(); exec(); }};#endif // AB_H
#include <QtCore>#include <QCoreApplication>#include <QDebug>#include "ab.h"int main(int argc, char *argv[]){ QCoreApplication app(argc, argv); //qWarning() << "App TP:" << QThread::currentThread(); qWarning() << "Application -> TID = " << QThread::currentThreadId(); ThA *tA = new ThA; ThB *tB = new ThB; tB->cB->moveToThread(tB); tA->cA->moveToThread(tA); QObject::connect(tA->cA, SIGNAL(sgFromA()), tB->cB, SLOT(slotB()), Qt::QueuedConnection); QObject::connect(tB->cB, SIGNAL(sgFromB()), tA->cA, SLOT(slotA2()), Qt::QueuedConnection); tA->start(); tB->start(); return app.exec();}
void slotA() { //for (int i=0;i<5;++i) { // qWarning() << "A::slotA() -> TID = " << QThread::currentThreadId(); // emit sgFromA(); //} forever { qWarning() << "A::slotA() -> TID = " << QThread::currentThreadId(); emit sgFromA(); } }
C++ (Qt)void MyThread::run(){ // Создали нужные объекты. // Приконектились куда надо. // ... exec(); // Запустили цикл обработки событий}
void run() { qWarning() << "running ThA::run() -> TID = " << QThread::currentThreadId(); cA->slotA(); exec(); }
C++ (Qt)void ThreadA::run(){ QTimer timer; connect( &timer, SIGNAL( timeout() ), SLOT( checkData() ) ); // Раз в секунду запускаем проверку данных timer.start( 1000 ); exec(); } void ThreadA::checkData(){ // Проверили и при необходимости emit dataCahnged(); // отправляем сигнал} void ThreadB::run(){ connect( threadA, SIGNAL( dataChanged() ), SLOT( processData() ) ); exec();} void ThreadB::processData(){ // Получили сигнал от А // Забрали данные // Обработали их}
#ifndef AB_H#define AB_H#include <QThread>#include <QDebug>#include <QTimer>class A : public QObject{ Q_OBJECTsignals: void sgFromA();public slots: void slotA() {//слот где инициализируем таймер qWarning() << "A::slotA() -> TID = " << QThread::currentThreadId(); QTimer *timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(slotA1())); timer->start(10); } void slotA1() {//слот где по таймеру выполняем емиттинг сигнала qWarning() << "A::slotA1() -> TID = " << QThread::currentThreadId(); emit sgFromA(); } void slotA2() {//слот который выполняется при выдаче классом В сигнала qWarning() << "A::slotA2() -> TID = " << QThread::currentThreadId(); }};class B: public QObject{ Q_OBJECTsignals: void sgFromB();public slots: void slotB() {//слот, который выполняется при выдаче классом А сигнала qWarning() << "B::slotB() -> TID = " << QThread::currentThreadId(); emit sgFromB(); }};class ThA : public QThread{public: A *cA; ThA() { cA = new A; }protected: void run() { qWarning() << "running ThA::run() -> TID = " << QThread::currentThreadId(); cA->slotA(); exec(); }};class ThB : public QThread{public: B *cB; ThB() { cB = new B; }protected: void run() { qWarning() << "running ThB::run() -> TID = " << QThread::currentThreadId(); exec(); }};#endif // AB_H