Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.12.2015, 23:54   #1
SENDEJER
 
Регистрация: 03.12.2015
Сообщений: 5
Восклицание многопоточность QT

помогите пояснить коды по блочно хотя бы , очень нужно пожалуйста ,помогите
Код:
#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[i] = 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


#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    qsrand(QTime::currentTime().msec());
    setFixedSize(geometry().width(),geometry().height());

    data.work = cfg_once = false;
    for (int i=0; i<deps_n; i++) data.deps[i] = 0;
}

MainWindow::~MainWindow()
{ delete ui; }

void MainWindow::on_emustart_clicked() {
    data.work = true;
    ui->emustart->setEnabled(false);
    ui->emustop->setEnabled(true);
    if (!cfg_once) { for (int i=0; i<deps_n; i++) runThread(i); cfg_once = true; }
}

void MainWindow::runThread(int id) {
    shop_data &ldat = data;
    depart *thread = new depart(id,ldat);
    connect(thread, SIGNAL(threadLog(QString)), SLOT(threadLogger(QString)));
    connect(thread, SIGNAL(updInf()), SLOT(updateInfo()));
    thread->exec();
}

void MainWindow::threadLogger(const QString msg) {
    ui->log->addItem(msg);ui->log->scrollToBottom();
}
void MainWindow::updateInfo() {
    for (int i=0;i<deps_n;i++) {
        switch (i) {
        case 0 :
            ui->o1status->setText(data.deps[i]>0?"Занято":"Свободно");
            ui->o1turn->setText(QString::number(data.deps[i]));
            break;
        case 1 :
            ui->o2status->setText(data.deps[i]>0?"Занято":"Свободно");
            ui->o2turn->setText(QString::number(data.deps[i]));
            break;
        case 2 :
            ui->o3status->setText(data.deps[i]>0?"Занято":"Свободно");
            ui->o3turn->setText(QString::number(data.deps[i]));
            break;
        }
    }
}

void MainWindow::on_emustop_clicked() {
    data.work = false;
    ui->emustop->setEnabled(false);
    ui->emustart->setEnabled(true);
}

Последний раз редактировалось Stilet; 04.12.2015 в 10:24.
SENDEJER вне форума Ответить с цитированием
Старый 04.12.2015, 10:25   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Перистый Бабай О_о
Че такой сложный код для обучения многопотока взял? Може тебе попроще разобрать пример?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 04.12.2015, 11:16   #3
SENDEJER
 
Регистрация: 03.12.2015
Сообщений: 5
Восклицание

Цитата:
Сообщение от Stilet Посмотреть сообщение
Перистый Бабай О_о
Че такой сложный код для обучения многопотока взял? Може тебе попроще разобрать пример?
хаха а просто помочь не? очень нужно (
SENDEJER вне форума Ответить с цитированием
Старый 04.12.2015, 11:23   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Для "просто помочь" нужно хотя бы наглости чутку сбавить. Думаешь все умеют кракозябры юникодовые читать? И текст задания не помешало бы в студию
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность garyanikin Работа с сетью в Delphi 5 16.11.2012 14:24
многопоточность blacktener Общие вопросы по Java, Java SE, Kotlin 1 25.07.2012 13:18
Многопоточность. Просветленный Общие вопросы Delphi 7 15.10.2011 15:44
Многопоточность boo_mago Общие вопросы C/C++ 7 21.03.2011 21:23
Многопоточность Dezmont_ Общие вопросы .NET 1 06.11.2010 18:34