| 142 | } |
| 143 | |
| 144 | void testTimerMultithreading() |
| 145 | { |
| 146 | createProbe(); |
| 147 | |
| 148 | { |
| 149 | auto *model = ObjectBroker::model(QStringLiteral("com.kdab.GammaRay.TimerModel")); |
| 150 | QVERIFY(model); |
| 151 | |
| 152 | QSharedPointer<QThread> mainThread(new QThread); |
| 153 | mainThread->setObjectName("mainThread"); |
| 154 | |
| 155 | // main thread free timer operating on "mainThread" object |
| 156 | mainThread->startTimer(125); |
| 157 | |
| 158 | // main thread qtimer |
| 159 | QSharedPointer<QTimer> mainTimer(new QTimer); |
| 160 | mainTimer->setObjectName("mainTimer"); |
| 161 | mainTimer->setInterval(250); |
| 162 | mainTimer->start(); |
| 163 | |
| 164 | // "mainThread" thread "threadTimer" qtimer |
| 165 | QSharedPointer<QTimer> threadTimer(new QTimer); |
| 166 | threadTimer->setObjectName("threadTimer"); |
| 167 | threadTimer->setInterval(100); |
| 168 | threadTimer->moveToThread(mainThread.data()); |
| 169 | |
| 170 | connect(mainThread.data(), &QThread::started, threadTimer.data(), static_cast<void (QTimer::*)()>(&QTimer::start)); |
| 171 | |
| 172 | int timerId = -1; |
| 173 | QTimer::singleShot(500, threadTimer.data(), [&]() { |
| 174 | // "threadTimer" thread free timer operating on "threadTimer" object |
| 175 | timerId = threadTimer->QObject::startTimer(250); |
| 176 | }); |
| 177 | |
| 178 | QSharedPointer<Deleter> deleter(new Deleter); |
| 179 | auto deleteTimer = new QTimer; |
| 180 | deleteTimer->setObjectName("deleteTimer"); |
| 181 | deleteTimer->setInterval(1500); |
| 182 | connect(deleteTimer, &QTimer::timeout, deleter.data(), &Deleter::deleteSender); |
| 183 | deleteTimer->start(); |
| 184 | |
| 185 | mainThread->start(); |
| 186 | QTest::qWait(6000); |
| 187 | |
| 188 | QModelIndex idx; |
| 189 | QVERIFY(model->rowCount() >= 4); |
| 190 | |
| 191 | idx = searchFixedIndex(model, "QThread (mainThread)"); |
| 192 | QVERIFY(idx.isValid()); |
| 193 | QCOMPARE(idx.data(ObjectModel::ObjectIdRole).value<ObjectId>(), ObjectId(mainThread.data())); |
| 194 | |
| 195 | idx = searchFixedIndex(model, "QTimer (mainTimer)"); |
| 196 | QVERIFY(idx.isValid()); |
| 197 | QCOMPARE(idx.data(ObjectModel::ObjectIdRole).value<ObjectId>(), ObjectId(mainTimer.data())); |
| 198 | |
| 199 | const auto idxs = searchFixedIndexes(model, "QTimer (threadTimer)"); |
| 200 | QCOMPARE(idxs.size(), 2); |
| 201 | for (const QModelIndex &idx : idxs) { |