Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 12

Как правильно выделить код для работы в отдельном от интерфейса потоке?

02.02.2016, 12:46. Показов 3249. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветы. Сам не программист, поэтому прошу совета.
Есть код который нужно выделить в отдельный поток от интерфейса(чтоб не подвисал во время работы).
Правильно ли в Qt так создавать поток?

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QThread>
 
namespace Ui {
class MainWindow;
}
 
class MyThread : public QThread
{
    Q_OBJECT
 
public:
    bool status;
protected:
    void run()
    {
        status = true;
 
        int i = 1;
        while (status)
        {
            usleep(1);
            emit progress(i);
            i++;
        }
 
    }
signals:
    void progress(int);
};
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    MyThread *thread;
 
private slots:
    void on_Button_Start_clicked();
 
    void on_Button_Stop_clicked();
 
private:
    Ui::MainWindow *ui;
};
 
#endif // MAINWINDOW_H
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include "mainwindow.h++"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    thread = new MyThread();
 
    connect(thread, SIGNAL(progress(int)), ui->label_Indikator, SLOT(setNum(int)));
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
void MainWindow::on_Button_Start_clicked()
{
    ui->Button_Start->setDisabled(1);
    ui->Button_Stop->setEnabled(1);
 
    thread->start();
}
 
void MainWindow::on_Button_Stop_clicked()
{
    ui->Button_Start->setEnabled(1);
    ui->Button_Stop->setDisabled(1);
    thread->status = false;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.02.2016, 12:46
Ответы с готовыми решениями:

Как сделать код работы с Selenium в отдельном потоке? Timer?
Как сделать что б в одельном потоке работал код и не стопорил основную программу?? захожу под роутер и программа стопорится и надо вести...

Как правильно сделать получение почты в отдельном потоке?
Всем добрый вечер. Пытаюсь получать определенные письма с почт посредством либлы mailkit. Все хорошо получается. Но программа на 3-4...

Как запустить код в отдельном потоке
Прошу прощения за явно нубский вопрос, но не нашёл на него ответа. Собственно мне хотелось бы знать чем реализовывать показ деятельности...

25
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
07.02.2016, 11:28
Студворк — интернет-сервис помощи студентам
RG6D8, вы как поток завершаете?
http://doc.qt.io/qt-5/qthread.html#details
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 12
07.02.2016, 12:58  [ТС]
Вы не на сообщения смотрите, а куда указывает дебагер.
Сюда:


RG6D8, вы как поток завершаете?
В обработчике нажатия кнопки:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void MainWindow::on_Button_Stop_clicked()
{
    ui->Button_Start->setEnabled(1);
    ui->Button_Stop->setDisabled(1);
 
    emit StopOperation();
 
    worker->thread()->quit();
    worker->thread()->wait();
    worker->thread()->deleteLater();
    worker->deleteLater();
    worker=0;
 
}
0
 Аватар для RazrFalcon
1403 / 1260 / 262
Регистрация: 10.11.2013
Сообщений: 3,763
07.02.2016, 13:26
Покажите конструктор. Как вы создаете поток.
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 12
07.02.2016, 13:34  [ТС]
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
 
    QThread* thread = new QThread();
    Worker* worker = new Worker();
    worker->moveToThread(thread);
 
    connect(worker, SIGNAL(progress(int)), ui->label_Indikator, SLOT(setNum(int)));
 
    connect(thread, SIGNAL(started()), worker, SLOT(initWorker()));
 
    connect(this, SIGNAL(StartOperation()), worker, SLOT(startProc()));
    connect(this, SIGNAL(StopOperation()), worker, SLOT(stopProc()));
 
    thread->start();
}
0
68 / 68 / 17
Регистрация: 20.01.2015
Сообщений: 347
07.02.2016, 15:51
RG6D8, ну т.е. вы в деструкторе сначала уничтожаете поток, в котором лежит объект, а потом пытаетесь удалить объект внутри уничтоженного потока?)

Напишите в конструкторе:
C++ (Qt)
1
2
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
connect(&myClass, &myClass::finishThread, workerThread, &workerThread::deleteLater);
а в деструкторе:
emit finishThread();

и все.
Я зачем ссылку на документацию приводил?)
0
0 / 0 / 0
Регистрация: 02.02.2016
Сообщений: 12
07.02.2016, 23:07  [ТС]
Ок, я добавил сигнал-слоты. Пытаюсь испускать сигнал закрытия потока по нажатию кнопки иии ничего, поток не удаляется.

Добавил архив проекта.
Вложения
Тип файла: zip potok3.zip (4.7 Кб, 3 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.02.2016, 23:07
Помогаю со студенческими работами здесь

Код батника для открытия ссылки в отдельном окне без интерфейса
Ребят, привет. Скиньте код для батника, чтобы происходило открытие ссылки в браузере. Но только не в обычном окне, а вот в таком, без...

Как запустить определённый код в отдельном потоке по нажатию кнопки?
как запустить определённый код в отдельном потоке по нажатию кнопки?(этот код бесконечен)

Индикация работы с записями в отдельном потоке
Всем доброго времени суток ! Имеется вот какая проблема работаю с большим кол-вом записей в БД во время работы процедур приложение как...

GDI+. Почему в отдельном потоке картинки сохраняются как белые прямоугольники, а в основном потоке - всё Ок?
Всем привет, делаю функцию уменьшения картинок при помощи библиотеки GDI+, в отдельном потоке происходит уменьшение картинки и её...

Выполнить код в отдельном потоке
Доброго времени суток уважаемые! Помогите пожалуйста разобраться с основами многопоточности. Предположим у нас есть класс, class1(); ,...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru