/
MaximU
/
application
Обзор
Документация
Войти
/
MaximU
/
application
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
workerthread.cpp
128 строк
4 KB
Максим
Упорядочены #include-ы.
15 июл 2026, 22:13
15 июл 2026, 22:13
ee4913b
Код
Авторство
О чём код?
#include "workerthread.h" #include <QCoreApplication> #include "application.h" #include "applicationspecifics.h" #include "exchangeinfo.h" #include "lockingqueue.h" #include "utc.h" ProfilerInfoClass gProfilerInfo; //!< Информация о выполнении алгоритмических блоков. bool gWork = true; //!< Признак выполнения обработки. extern LockingQueue<std::shared_ptr<char[]>> gOutputPool; //!< Пул массивов выходной информации. Используется для сокращения операций выделения памяти под массивы выходной информации. extern LockingQueue<std::shared_ptr<char[]>> gOutputQueue; //!< Очередь массивов выходной информации, ожидающих отправки. /*! * \brief Конструктор. */ WorkerThread::WorkerThread() : QThread() { gProfilerInfo.reset(); } /*! * \brief Деструктор. */ WorkerThread::~WorkerThread() { } /*! * \brief Инициализирует главный поток приложения. */ void WorkerThread::initWorkerThread() { connect(this, &WorkerThread::iterationDone, App, &Application::slot_workerThread_iterationDone, Qt::BlockingQueuedConnection); connect(this, &WorkerThread::exception, App, &Application::slot_workerThread_exception, Qt::BlockingQueuedConnection); initSpecific(); } /*! * \brief Удаляет данные главного потока приложения. */ void WorkerThread::exitWorkerThread() { blockSignals(true); // Для исключения deadlock при вызове emit iterationDone при завершении итерации. QCoreApplication::instance()->processEvents(); mAbort = true; wait(); exitSpecific(); } /*! * \brief Содержит код, выполняемый во время работы потока. */ void WorkerThread::run() { while (!mAbort) { //// Ожидание поступления входной информации. std::shared_ptr<char[]> data = waitForData(); if (data != nullptr) { //// Сохранение значения смещения времени относительно UTC. gOffsetUTCExt = reinterpret_cast<ExchangeInfo *>(data.get())->header.offsetUTC; //// Обработка входной информации. if (!mAbort) { if (gWork) { try { QSet<int> results; QElapsedTimer duration; duration.start(); mBlockID = 0; processInput(data.get(), results); prepareOutput(results); gProfilerInfo.timeTotal = duration.nsecsElapsed() / 1000000000.0f; emit iterationDone(results); } catch (...) { QString exceptionMessage; exceptionSpecific(exceptionMessage); emit exception(exceptionMessage); } //// Освобождение обработанного массива входной информации. releaseInputBuffer(data); } } } } } /*! * \brief Ожидает поступления массива входной информации. * \return Массив входной информации. */ std::shared_ptr<char[]> WorkerThread::waitForData() { while (!mAbort) { std::shared_ptr<char[]> data = acquireInputData(); if (data != nullptr) { return data; } msleep(1); } return nullptr; }