#ifndef ABSTRACTITEMTESTING_H#define ABSTRACTITEMTESTING_H#include <QThread>#include <QObject>class AbstractItemTesting : public QThread{ Q_OBJECTpublic: AbstractItemTesting(QObject* parent = 0) : QThread(parent) { setTerminationEnabled(true); } virtual ~AbstractItemTesting() {} virtual void run() = 0; QString getName() {return itemName;}protected: QString itemName;signals: void testResults(QString itemName_, QString message_, bool noError_);};#endif // ABSTRACTITEMTESTING_H//Класс-пример для тестирования устройства #ifndef ITEMTESTING1_H#define ITEMTESTING1_H#include "abstractitemtesting.h"#include <QObject>class ItemTesting1 : public AbstractItemTesting{public: ItemTesting1(QObject *parent = 0); void run();};#endif // ITEMTESTING1_H//Его реализация#include "itemtesting1.h"#include <QTimer>#include <QDebug>ItemTesting1::ItemTesting1(QObject *parent) : AbstractItemTesting(parent){ itemName = "ItemName1";}/*virtual*/ void ItemTesting1::run(){ qDebug() << "Started " << itemName; //Имитация тестирования msleep(1000); emit testResults(itemName, tr("[OK]"), true);}//Класс тестирующей системы#ifndef TESTINGSYSTEM_H#define TESTINGSYSTEM_H#include <QObject>#include <QVector>//class QVector;class TestingDialog;class AbstractItemTesting;class TestingSystem : public QObject{ Q_OBJECTpublic: TestingSystem(QObject* parent = 0); void setMaxTime(long maxTimeMs_);public slots: void startTesting();private: QVector<AbstractItemTesting*> items; //Вектор, содержащий ссылки на тестирующие объекты long maxTestTimeMs; //Максимальное время тестирования (в миллисекундах) int itemsForTest; //Общее количество тестируемых устройств int reportsResieved; //Счетчик полученных отчетов о тестировании bool noErrors; //Флаг отсутствия сообщений об ошибках в отчетахprivate slots: void getReport(QString, QString, bool); //Обработка пришедшего сообщения void timeExpired(); //Прекращение тестирования по отсечке времени};#endif // TESTINGSYSTEM_H//Реализация класса тестирующей системы#include "testingsystem.h"#include "abstractitemtesting.h"#include "itemtesting1.h"#include "itemtesting2.h"#include "testingdialog.h"#include <QVector>#include <QTimer>#include <QDebug>const long MAX_TIME_MS = 10000; //рП ХНПМЮБОЙА ПФЧПДЙФУС 10 УЕЛХОДTestingSystem::TestingSystem(QObject* parent) : QObject(parent), maxTestTimeMs(MAX_TIME_MS){ //Объявление экземпляров классов для тестирования устройств (в каждой системе - свой набор) AbstractItemTesting* item1 = new ItemTesting1(this); AbstractItemTesting* item2 = new ItemTesting2(this); items.append(item1); items.append(item2); itemsForTest = items.size(); for (int itemNum = 0; itemNum < itemsForTest; ++itemNum) connect(items[itemNum], SIGNAL(testResults(QString,QString,bool)), this, SLOT(getReport(QString,QString,bool)));}void TestingSystem::setMaxTime(long maxTimeMs_){ maxTestTimeMs = maxTimeMs_;}void TestingSystem::startTesting(){ reportsResieved = 0; noErrors = true; for (int itemNum = 0; itemNum < itemsForTest; ++itemNum) items[itemNum]->start(); QTimer::singleShot(maxTestTimeMs, this, SLOT(timeExpired())); qDebug() << "Max Time = " << maxTestTimeMs << " ms";}void TestingSystem::getReport(QString itemName, QString message, bool testOk){ noErrors &= testOk; qDebug() << itemName << message << testOk; if (++reportsResieved == items.size()) { qDebug() << "System test: " << noErrors; //close(0); //??? Не совсем понимаю, как "выходить" из тестирования. Возможно, "грохнув" весь объект }}void TestingSystem::timeExpired(){ for (int itemNum = 0; itemNum < itemsForTest; ++itemNum) if (items[itemNum]->isRunning()) { items[itemNum]->terminate(); getReport(items[itemNum]->getName(), "[TIME EXPIRED]", false); }}//Так будет начинаться тестированиеmyTestingSystem = new TestingSystem(this);myTestingSystem->setMaxTime(5000);myTestingSystem->startTesting();