// // Created by fomenko on 27.09.2019. // #ifndef AWRCANFLASHER_TESTUTIL_H #define AWRCANFLASHER_TESTUTIL_H #include "pithread.h" /** * Minimum wait thread start, switch context or another interthread communication action time. Increase it if tests * write "Start thread timeout reach!" message. You can reduce it if you want increase test performance. */ const int WAIT_THREAD_TIME_MS = 40; const int THREAD_COUNT = 5; class TestUtil: public PIObject { PIOBJECT(TestUtil) public: double threadStartTime; PIThread* thread = new PIThread(); volatile bool isRunning; std::function adapterFunctionDefault; bool createThread(const std::function& fun = nullptr, PIThread* thread_ = nullptr) { std::function actualFun = fun == nullptr ? adapterFunctionDefault : fun; if (thread_ == nullptr) thread_ = thread; thread_->startOnce([=](void*){ actualFun(); }); return waitThread(thread_); } bool waitThread(PIThread* thread_, bool runningStatus = true) { PITimeMeasurer measurer; bool isTimeout = !thread_->waitForStart(WAIT_THREAD_TIME_MS); while (!isRunning) { isTimeout = WAIT_THREAD_TIME_MS <= measurer.elapsed_m(); if (isTimeout) break; piMSleep(1); } threadStartTime = measurer.elapsed_m(); if (isTimeout) piCout << "Start thread timeout reach!"; if (threadStartTime > 1) { piCout << "Start time" << threadStartTime << "ms"; } else if (threadStartTime > 0.001) { piCout << "Start time" << threadStartTime * 1000 << "mcs"; } else { piCout << "Start time" << threadStartTime * 1000 * 1000 << "ns"; } return !isTimeout; } }; #endif //AWRCANFLASHER_TESTUTIL_H