Russian Qt Forum
Октябрь 01, 2024, 00:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QT многопоточность  (Прочитано 2740 раз)
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
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #1 : Декабрь 04, 2015, 05:49 »

Создаем наследника от QThread
В конструкторе для таймера определяем случайное время от msec_min до msec_max
В методе exec запускаем таймер и обрабатываем его срабатывания в методе timerEvent
В timerEvent проверяем что сработал наш таймер и что возведен флаг work
В условии проверяем 40% шанс и что покупателей приходило меньше max_buyers
После добавляем к счетчику единицу, задаем какое-то рандомное число от 1 до 3 и логируем, отсылая сигнал threadLog
Далее вызывается if (data.deps[id] > 0) { и мне дальше не хочется вникать Улыбающийся
Записан

Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.078 секунд. Запросов: 23.