diff --git a/qt_event_signal/main.cpp b/qt_event_signal/main.cpp index 62a3d0dad3be76364d562906c5df55bf8bdb7a61..63aa8908eab0371dc2f91bef9fd4e6d3e7521fed 100644 --- a/qt_event_signal/main.cpp +++ b/qt_event_signal/main.cpp @@ -82,32 +82,43 @@ int main(int argc, char *argv[]) thread2->start(); printf("Test signals and slots...\n"); + QCoreApplication::processEvents(); a.connect (obj1,&TestObj::sig_finished,[=]()->void{ printf("Test Events...\n"); QThread::msleep(1000); - QCoreApplication::postEvent(obj1,new QEvent(TestEvent::startEvt())); + QCoreApplication::postEvent(obj1,new QEvent(TestMsg::startEvt())); }); a.connect (obj1,&TestObj::evt_finished,[=]()->void{ QThread::msleep(1000); - QCoreApplication::postEvent(obj1,new QEvent(TestEvent::quitEvt())); - QCoreApplication::postEvent(obj2,new QEvent(TestEvent::quitEvt())); + QCoreApplication::postEvent(obj1,new QEvent(TestMsg::quitEvt())); + QCoreApplication::postEvent(obj2,new QEvent(TestMsg::quitEvt())); }); QThread::msleep(1000); + QCoreApplication::processEvents(); - - QCoreApplication::postEvent(obj1,new QEvent(TestEvent::startSig())); + QCoreApplication::postEvent(obj1,new QEvent(TestMsg::startSig())); a.processEvents(); thread1->wait(); thread2->wait(); + QThread::msleep(1000); + + obj1->runDirectCall(); + printf("Finished.\n"); + thread1->deleteLater(); + thread2->deleteLater(); + obj1->deleteLater(); + obj2->deleteLater(); + QThread::msleep(1000); + QCoreApplication::processEvents(); return 0; } diff --git a/qt_event_signal/testevent.cpp b/qt_event_signal/testevent.cpp index 2bb734fb49e2c252b190cf3180a47554e19130a4..ef167b0aaa3cfa2497f88a3e81d8668fe0ded316 100644 --- a/qt_event_signal/testevent.cpp +++ b/qt_event_signal/testevent.cpp @@ -1,18 +1,18 @@ #include "testevent.h" #include //Regisit a event -QEvent::Type TestEvent::m_testEvt = (QEvent::Type)QEvent::registerEventType(); -QEvent::Type TestEvent::m_startEvt = (QEvent::Type)QEvent::registerEventType(); -QEvent::Type TestEvent::m_startSig = (QEvent::Type)QEvent::registerEventType(); -QEvent::Type TestEvent::m_quit = (QEvent::Type)QEvent::registerEventType(); +QEvent::Type TestMsg::m_testEvt = (QEvent::Type)QEvent::registerEventType(); +QEvent::Type TestMsg::m_startEvt = (QEvent::Type)QEvent::registerEventType(); +QEvent::Type TestMsg::m_startSig = (QEvent::Type)QEvent::registerEventType(); +QEvent::Type TestMsg::m_quit = (QEvent::Type)QEvent::registerEventType(); -TestEvent::TestEvent(clock_t clk) +TestMsg::TestMsg(clock_t clk) :QEvent(m_testEvt) ,m_clk(clk) { } -TestEvent::~TestEvent() +TestMsg::~TestMsg() { //qDebug()<<"Destory"; } diff --git a/qt_event_signal/testevent.h b/qt_event_signal/testevent.h index 2c943c45152b191b013e52849228627e9624bd3f..be5ae6bae2979a369492cef444779d2428c4d53d 100644 --- a/qt_event_signal/testevent.h +++ b/qt_event_signal/testevent.h @@ -3,7 +3,8 @@ #include #include -class TestEvent : public QEvent +#include +class TestMsg : public QEvent { private: static QEvent::Type m_testEvt; @@ -11,15 +12,23 @@ private: static QEvent::Type m_startSig; static QEvent::Type m_quit; clock_t m_clk = 0; + QString m_dummyLongStr; public: - TestEvent(clock_t clk); - ~TestEvent(); + TestMsg(clock_t clk); + ~TestMsg(); inline clock_t clock() {return m_clk;} + inline void fillStr(int len) + { + for (int i=0;i #include #include -static const int testCounts = 100000; - +static const int testCounts = 10000; +static const int fillStrLen = 1024; TestObj::TestObj(QObject *parent) : QObject{parent} { @@ -13,16 +13,17 @@ TestObj::TestObj(QObject *parent) void TestObj::customEvent(QEvent * evt) { - if (evt->type()==TestEvent::type()) + if (evt->type()==TestMsg::type()) { clock_t curr_clk = clock(); if (m_nFirstClkEvt==-1) m_nFirstClkEvt = curr_clk; - TestEvent * e = dynamic_cast(evt); + TestMsg * e = dynamic_cast(evt); if (e) { clock_t delay = curr_clk - e->clock(); m_nDelay_Evts += delay; + e->fillStr(fillStrLen); ++m_nCount_Evts; } if (m_nEmittedEvts<=testCounts) @@ -43,7 +44,7 @@ void TestObj::customEvent(QEvent * evt) if (m_buddy->m_nCount_Evts>testCounts && m_nCount_Evts>testCounts ) emit evt_finished(); } - else if (evt->type()==TestEvent::startEvt()) + else if (evt->type()==TestMsg::startEvt()) { m_nCount_Evts = 0; m_nDelay_Evts = 0; @@ -58,7 +59,7 @@ void TestObj::customEvent(QEvent * evt) } next_event(); } - else if (evt->type()==TestEvent::startSig()) + else if (evt->type()==TestMsg::startSig()) { m_nCount_Sigs = 0; m_nDelay_Sigs = 0; @@ -73,7 +74,7 @@ void TestObj::customEvent(QEvent * evt) } next_signal(); } - else if (evt->type()==TestEvent::quitEvt()) + else if (evt->type()==TestMsg::quitEvt()) { thread()->quit(); } @@ -86,14 +87,13 @@ void TestObj::test_slot16(QEvent * evt) if (m_nFirstClkSig==-1) m_nFirstClkSig = curr_clk; - TestEvent * e = dynamic_cast(evt); + TestMsg * e = dynamic_cast(evt); if (e) { clock_t delay = curr_clk - e->clock(); - m_nDelay_Evts += delay; - ++m_nCount_Evts; m_nDelay_Sigs += delay; ++m_nCount_Sigs; + e->fillStr(fillStrLen); if (m_nEmittedSigs<=testCounts) next_signal(); if (m_nCount_Sigs==testCounts) @@ -116,7 +116,7 @@ void TestObj::test_slot16(QEvent * evt) void TestObj::next_signal() { - emit test_sig16(new TestEvent(clock())); + emit test_sig16(new TestMsg(clock())); ++m_nEmittedSigs; } void TestObj::next_event() @@ -124,5 +124,45 @@ void TestObj::next_event() if (!m_buddy) return; ++m_nEmittedEvts; - QCoreApplication::postEvent(m_buddy,new TestEvent(clock())); + QCoreApplication::postEvent(m_buddy,new TestMsg(clock())); +} +void TestObj::runDirectCall() +{ + m_nCount_Dir = 0; + m_nDelay_Dir = 0; + m_nFirstClkDir = -1; + printf("Test Direct Call...\n"); + for (int i=0;i(evt); + if (e) + { + clock_t delay = curr_clk - e->clock(); + m_nDelay_Dir += delay; + ++m_nCount_Dir; + e->fillStr(fillStrLen); + if (m_nCount_Dir==testCounts) + { + QTextStream strm(stdout); + strm << objectName()<< QString().asprintf(" (%llX) run %d Direct Calls, total costs %.2lf ms, AVG cost %.2lf us / test, AVG delay=%.2lf us.\n" + ,(unsigned long long)this + ,(int)(m_nCount_Dir) + ,1e3 * (curr_clk - m_nFirstClkDir) / CLOCKS_PER_SEC + ,1e6 * (curr_clk - m_nFirstClkDir) / CLOCKS_PER_SEC / testCounts + ,1e6 * m_nDelay_Dir/ CLOCKS_PER_SEC / m_nCount_Dir + ); + strm.flush(); + } + delete e; + } + } diff --git a/qt_event_signal/testobj.h b/qt_event_signal/testobj.h index ea6358d1ae872e59dc924d4c6ee3d2b5474b4eda..02dbf4252a30af6e7aafa9198fc66fc9196d8c88 100644 --- a/qt_event_signal/testobj.h +++ b/qt_event_signal/testobj.h @@ -13,6 +13,7 @@ public: m_buddy = buddy; buddy->m_buddy = this; } + void runDirectCall(); public slots: void test_slot1(QEvent * evt){} void test_slot2(QEvent * evt){} @@ -80,6 +81,10 @@ private: clock_t m_nFirstClkEvt = -1; quint32 m_nCount_Evts = 0; clock_t m_nDelay_Evts = 0; + + clock_t m_nFirstClkDir = -1; + quint32 m_nCount_Dir = 0; + clock_t m_nDelay_Dir = 0; private: quint32 m_nEmittedSigs = 0; quint32 m_nEmittedEvts = 0; @@ -87,6 +92,8 @@ private: private: void next_signal(); void next_event(); +private: + void direct_call(QEvent * evt); }; #endif // TESTOBJ_H