Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: SENDEJER от Декабрь 03, 2015, 23:48



Название: 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) { и мне дальше не хочется вникать :)