#include #include #define NUM_THREADS 1 #define NUM_TIMERS 5 class ThreadTest; class MyThread : public QThread { Q_OBJECT public: MyThread(ThreadTest* parent = 0); void run(); ThreadTest* main; signals: void myupdate(); }; class ThreadTest : public QWidget { Q_OBJECT public: ThreadTest(QWidget* parent = 0); void paintEvent(QPaintEvent* event); int msgCnt; QTimer myTimer; MyThread* myThreads[NUM_THREADS]; QTimer* moreTimers[NUM_TIMERS]; private slots: void myupdateSlot(); void timeoutSlot(); void moreTimersSlot(); }; MyThread::MyThread(ThreadTest* parent) : QThread(parent) { main = parent; } void MyThread::run() { QRandomGenerator64 gen; forever{ quint64 r = gen.generate64(); msleep(r % 1000); emit myupdate(); // Simulate message arriving from network } } /////////////////////////////////////////////////////////////////////////////// ThreadTest::ThreadTest(QWidget* parent) : QWidget(parent) { msgCnt = 0; setWindowTitle(tr("ThreadTest")); resize(550, 400); qint32 x; for (x = 0; x < NUM_THREADS; x++) { myThreads[x] = new MyThread(this); connect(myThreads[x], SIGNAL(myupdate()), this, SLOT(myupdateSlot())); myThreads[x]->start(); } for (x = 0; x < NUM_TIMERS; x++) { moreTimers[x] = new QTimer; connect(moreTimers[x], SIGNAL(timeout()), this, SLOT(moreTimersSlot())); moreTimers[x]->start(10); } connect(&myTimer, SIGNAL(timeout()), this, SLOT(timeoutSlot())); myTimer.setSingleShot(true); myTimer.start(100); } void ThreadTest::paintEvent(QPaintEvent*) { QPainter painter(this); painter.fillRect(rect(), Qt::black); QFont myfont = QFont("Verdana", 20); painter.setFont(myfont); painter.setPen(Qt::white); painter.drawText(rect(), Qt::AlignCenter, QString("Cnt=%1").arg(msgCnt)); Sleep(30); // This version hangs the entire application } void ThreadTest::myupdateSlot() { msgCnt++; Sleep(30); // This version hangs the entire application myTimer.stop(); myTimer.start(0); } void ThreadTest::timeoutSlot() { QRandomGenerator64 gen; quint64 r = gen.generate64(); myTimer.start(r % 1000); update(); } void ThreadTest::moreTimersSlot() { } /////////////////////////////////////////////////////////////////////////////////////// int main(int argc, char* argv[]) { QApplication app(argc, argv); ThreadTest widget; widget.show(); return app.exec(); } #include