Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // mainwindow.cpp
- #include "mainwindow.h"
- #include "ui_mainwindow.h"
- MainWindow::MainWindow(QWidget *parent)
- : QMainWindow(parent)
- , ui(new Ui::MainWindow)
- {
- ui->setupUi(this);
- mtcount = 1; // 1 поток
- initMultiThread(); // инициализация одного потока
- }
- MainWindow::~MainWindow()
- {
- delete ui;
- }
- void MainWindow::initMultiThread() // Инициализация mtcount количества потоков
- {
- if(reinit) log("Инициализация потоков: " ); // выводить логи только если идет реиницилазиция потоков
- for (int i = 0; i < mtcount; i++)
- {
- multiThreads[i] = new my_thread(i + 1);
- multiThreads[i]->start();
- connect(multiThreads[i], &my_thread::statusUpdate, this, &MainWindow::multiThreadInfo);
- QString stateText = "thread " + QString::number(i + 1) + ": " + "Initialized"; // Вывод информации, что поток инициализирован
- if(reinit) log(stateText); // выводить логи только если идет реиницилазиция потоков
- }
- ui->label_threads->setText("Сейчас потоков: " + QString::number(mtcount)); // информация сколько потоков сейчас запущено
- enableMTButtons(); // разблокировать кнопки
- showMTButtons(); // показать кнопки если они спрятаны
- if(reinit) log("Все потоки инициализированы"); // выводить логи только если идет реиницилазиция потоков
- reinit = false; // нужна для кнопки реинициализации потоков. когда тру, тогда мы ждем удаления старых потоков и инициализируем новые (проверка в методе multiThreadInfo())
- }
- // запуск работы потоков
- void MainWindow::on_pushButtonMultiThreadWork_clicked()
- {
- log("Работа потоков: ");
- setMultiThreadCommand(1, -1); // отправить команду 1 (работать) с временем -1 (когда мы отправляем -1, тогда время равняется рандомному)
- unlockMultiThreadMutex(); // разлок мьютекса
- disableMTButtons(); // отключение кнопок
- }
- // Отправляет команду "умереть" потокам
- void MainWindow::on_pushButtonMultiThreadKill_clicked()
- {
- log("Удаление потоков: ");
- setMultiThreadCommand(2, -1);
- unlockMultiThreadMutex(); // разлок мьютекса
- hideMTButtons(); // спрятать кнопок
- disableMTButtons(); // отключить кнопки
- //mtcount = 0;
- ui->label_threads->setText("Сейчас потоков: 0"); // Все потоки мертвы. Потоков сейчас 0
- }
- void MainWindow::on_pushButtonMultiThreadKill_2_clicked() // Нажатие на кнопку инициализировать потоки
- {
- // Мы сначала удаляем все старые потоки, а потом инициализируем новые
- reinit = true;
- if(mtcount > 0){
- log("Удаление " + QString::number(mtcount) + " потоков для реинициализации: ");
- setMultiThreadCommand(2, -1); // Отправить команду удалить с рандомным временем выполнения
- unlockMultiThreadMutex(); // разлочить мьютекс
- disableMTButtons(); // отключить кнопки
- }
- else{
- mtcount = ui->spinBox->value(); // новое кол-во потоков
- initMultiThread(); // инит потоков
- }
- }
- // Установка команды на каждом потоке
- void MainWindow::setMultiThreadCommand(int command, int time)
- {
- for (int i = 0; i < mtcount; i++) // перебор потоков
- multiThreads[i]->setCommand(command, time); // отправка команды каждому потоку
- }
- // Разблокивка мьютексов на всех потоках
- void MainWindow::unlockMultiThreadMutex()
- {
- for (int i = 0; i < mtcount; i++) // перебор потоков
- multiThreads[i]->unlock(); // разлок
- }
- void MainWindow::multiThreadInfo() // Вывод информации о потоке
- {
- // Отображение информации об одном потоке (который вызвал данный сигнал)
- auto threadSender = static_cast<my_thread *>(sender());
- if (threadSender != nullptr)
- {
- QString stateText = "thread " + QString::number(threadSender->getNumber()) + ": ";
- switch (threadSender->getCommand()) {
- case 3: // Поток выполнил работу
- stateText += "Stopped ";
- break;
- case 4: // Поток умер
- stateText += "Deleted ";
- break;
- }
- stateText += QString::number(threadSender->getCounter()) + " ms"; // thread *number* : *command* *time* ms
- log(stateText);
- }
- // Если все потоки выполнили команды, то выводится информация об этом
- if (isMultiThreadStopped())
- {
- log("Все потоки отработали и остановлены");
- enableMTButtons(); // если все потокои остановились в выполнение задачи разлочить кнопки
- }
- else if (isMultiThreadKilled())
- {
- // Все потоки умерли
- log("Все потоки удалены");
- hideMTButtons(); // если все потокои умерли убрать кнопки
- mtcount = 0;
- if(reinit){ // Если потоки убивались с целью реинициализиации
- mtcount = ui->spinBox->value(); // новое кол-во потоков
- initMultiThread(); // инит потоков
- }
- }
- }
- // Блокировка кнопок
- void MainWindow::disableMTButtons()
- {
- ui->pushButtonMultiThreadWork->setEnabled(false);
- ui->pushButtonMultiThreadKill->setEnabled(false);
- ui->pushButtonMultiThreadKill_2->setEnabled(false);
- ui->spinBox->setEnabled(false);
- }
- // Разблокировка кнопок
- void MainWindow::enableMTButtons()
- {
- ui->pushButtonMultiThreadWork->setEnabled(true);
- ui->pushButtonMultiThreadKill->setEnabled(true);
- ui->pushButtonMultiThreadKill_2->setEnabled(true);
- ui->spinBox->setEnabled(true);
- }
- // Скрытие кнопок
- void MainWindow::hideMTButtons()
- {
- ui->spinBox->setEnabled(true);
- ui->pushButtonMultiThreadKill_2->setEnabled(true);
- ui->pushButtonMultiThreadWork->hide();
- ui->pushButtonMultiThreadKill->hide();
- }
- void MainWindow::showMTButtons()
- {
- ui->spinBox->setEnabled(true);
- ui->pushButtonMultiThreadKill_2->setEnabled(true);
- ui->pushButtonMultiThreadWork->show();
- ui->pushButtonMultiThreadKill->show();
- }
- // Проверка потоков. Если все потоки остановились вернет true
- bool MainWindow::isMultiThreadStopped()
- {
- for (int i = 0; i < mtcount; i++)
- {
- if (multiThreads[i]->getCommand() != 3)
- return false;
- }
- return true;
- }
- // Проверка потоков. Если все потоки умерли вернет true
- bool MainWindow::isMultiThreadKilled()
- {
- if(mtcount == 0) return true;
- for (int i = 0; i < mtcount; i++)
- {
- if (multiThreads[i]->getCommand() != 4)
- return false;
- }
- return true;
- }
- // Обработчик нажатия на кнопку очистить текст
- void MainWindow::on_pushButtonClear_clicked()
- {
- ui->textEdit->clear();
- }
- // Логирование в textEdit
- void MainWindow::log(QString content)
- {
- ui->textEdit->append(content);
- }
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
- //
- // mainwindow.h
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
- #include <QMainWindow>
- #include "my_thread.h"
- QT_BEGIN_NAMESPACE
- namespace Ui { class MainWindow; }
- QT_END_NAMESPACE
- class MainWindow : public QMainWindow
- {
- Q_OBJECT
- public:
- explicit MainWindow(QWidget *parent = nullptr);
- ~MainWindow();
- int mtcount;
- int time;
- bool reinit = false;
- my_thread *multiThreads[100];
- private slots:
- void on_pushButtonMultiThreadWork_clicked();
- void on_pushButtonMultiThreadKill_clicked();
- void multiThreadInfo();
- void on_pushButtonClear_clicked();
- void on_pushButtonMultiThreadKill_2_clicked();
- private:
- Ui::MainWindow *ui;
- void initLoopThread();
- void initMultiThread();
- void setMultiThreadCommand(int command, int time);
- void unlockMultiThreadMutex();
- bool isMultiThreadStopped();
- bool isMultiThreadKilled();
- void log(QString text);
- void logLoopState(my_thread *thread);
- void disableLLButtons();
- void enableLLButtons();
- void hideLLButtons();
- void showLLButtons();
- void disableMTButtons();
- void enableMTButtons();
- void hideMTButtons();
- void showMTButtons();
- };
- #endif // MAINWINDOW_H
Add Comment
Please, Sign In to add comment