Название: QT многопоточность Отправлено: SENDEJER от Декабрь 03, 2015, 23:48 помогите пожалуйста пояснить код? хотя бы по блокам, очень нужно
#ifndef BEE_H #define BEE_H #include <QBasicTimer> #include <QTimerEvent> #include <QObject> #include <QThread> #include <QString> #include <QTime> const int deps_n = 3; const int max_buyers = 100; const int msec_min = 1000; const int msec_max = 3000; struct shop_data { int deps[3]; bool work; }; class depart : public QThread { Q_OBJECT public: explicit depart(int nid, shop_data &thd) : QThread(), data(thd) { id = nid; qsrand(QTime::currentTime().msec()*id); msec = random(msec_min, msec_max); } void exec() { timer.start(msec, this); } static bool chances(int chance) { int roll = random(0,100); if (roll <= chance) return true; else return false; } static int random(int low, int high) {return qrand()%((high+1)-low)+low;} protected: void timerEvent(QTimerEvent *event) { if (event->timerId() == timer.timerId()) { if (data.work == true) { QString idstr = QString::number(id+1); if (chances(40) && data.deps[id]<max_buyers) { data.deps[id]++; buyers[data.deps[id]-1] = random(1,3); log("Покупатель пришел РІ отдел "+idstr+"."); } if (data.deps[id] > 0) { buyers[0]--; if (buyers[0] == 0) { for (int i=0; i<data.deps[id]-1; i++) buyers = buyers[i+1]; data.deps[id]--; log("Покупатель РІ отделе "+idstr+" обслужен."); if (data.deps[id] == 0) log("Продавец РІ отделе "+idstr+" свободен."); } } emit updInf(); } } else QThread::timerEvent(event); } private: void log(const QString msg) { emit threadLog(msg); } signals: void threadLog(const QString msg); void updInf(); public: int id, msec; int buyers[max_buyers]; shop_data &data; private: QBasicTimer timer; }; #endif Название: Re: QT многопоточность Отправлено: gil9red от Декабрь 04, 2015, 05:49 Создаем наследника от QThread
В конструкторе для таймера определяем случайное время от msec_min до msec_max В методе exec запускаем таймер и обрабатываем его срабатывания в методе timerEvent В timerEvent проверяем что сработал наш таймер и что возведен флаг work В условии проверяем 40% шанс и что покупателей приходило меньше max_buyers После добавляем к счетчику единицу, задаем какое-то рандомное число от 1 до 3 и логируем, отсылая сигнал threadLog Далее вызывается if (data.deps[id] > 0) { и мне дальше не хочется вникать :) |