Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/34: Рейтинг темы: голосов - 34, средняя оценка - 4.94
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
1

Выполнение функции в новом потоке

07.06.2019, 14:50. Показов 6409. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Привет. Как мне функцию foo() поместить в отдельный поток? чтобы окно было активным, пока данные подгружаются в foo().
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
MainWidget::MainWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MainWidget)
{
    ui->setupUi(this);
 
    _treeModel = new TreeModel(this);
    ui->treeView->setModel(_treeModel);
   _treeModel->init();
   _treeModel->foo();
}
 
MainWidget::~MainWidget()
{
    delete ui;
}
Пробую так,
Кликните здесь для просмотра всего текста
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
MainWidget::MainWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MainWidget)
{
    ui->setupUi(this);
 
    _treeModel = new TreeModel(this);
    ui->treeView->setModel(_treeModel);
   _treeModel->init();
 
   QThread *thread = new QThread;
//   TreeModel *worker = new TreeModel();
   _treeModel->moveToThread(thread);
   connect(thread, SIGNAL(started() ),  _treeModel, SLOT(foo()) );
   connect(_treeModel, SIGNAL(finished() ), thread, SLOT(quit()) );
   connect(_treeModel, SIGNAL(finished() ), _treeModel, SLOT(deleteLater()) );
   connect(thread, SIGNAL(finished() ), thread, SLOT(deleteLater()) );
   thread->start();
 
//   _treeModel->foo();
}
 
MainWidget::~MainWidget()
{
    delete ui;
}

ничего не получается. ui модель передать в поток нельзя. А как тогда мне это сделать?
foo() переместить в другой класс не могу, эта функция жестко связана с моделью.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.06.2019, 14:50
Ответы с готовыми решениями:

Не работает выполнение функции в отдельном потоке
Привет. Есть код: showLightBox("Please Wait...", "black", false); QFuture<bool> future =...

конструктор в новом потоке?
Добрый день, народ. Не могу решить задачу с потоками, перепробовал миллион способов... Как...

Выполнение кода в потоке
Здравствуйте, почему-то код который отрабатывает нормально без потока и программа запускается,...

Выполнение слота присоединённого к таймеру в потоке
Здравствуйте, подскажите пожалуйста, возможно ли выполнение слота присоединённого к таймеру в...

3
716 / 676 / 110
Регистрация: 29.05.2015
Сообщений: 4,079
07.06.2019, 20:12 2
Глобальная переменная. Данные из потока загружаются туда, функция фуу читает их оттуда.
0
зомбяк
1584 / 1218 / 345
Регистрация: 14.05.2017
Сообщений: 3,940
07.06.2019, 20:34 3
Лучший ответ Сообщение было отмечено Джон Кофи как решение

Решение

Цитата Сообщение от Джон Кофи Посмотреть сообщение
чтобы окно было активным, пока данные подгружаются в foo()
Вот не должно быть привязки к интерфейсу с
C++ (Qt)
1
ui->treeView->setModel(_treeModel);
до того момента, пока модель не будет полностью заполнена в другом потоке.

Добавлено через 1 минуту
Цитата Сообщение от Джон Кофи Посмотреть сообщение
_treeModel = new TreeModel(this);
Такого тоже не должно быть, передаваемый другому потоку объект не должен иметь родителя в этом потоке.

Добавлено через 7 минут
Если будет предусмотрено блокирование повторных запусков обновления, можно сделать например так:

C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    QEventLoop event_loop(p_parent);
    QThread other_thread(p_parent);
    ObjProcessor *p_processor = new ObjProcessor(0, &byte_array);
    p_processor->moveToThread(&other_thread);
 
    connect(this, SIGNAL(StartProcess()), p_processor, SLOT(StartProcess()));
    connect(p_processor, SIGNAL(ProcessFinished()), &event_loop, SLOT(quit()));
    other_thread.start();
 
    emit StartProcess();
    event_loop.exec();
 
    p_processor->deleteLater();
    other_thread.exit();
    other_thread.wait();
Даёт квази-последовательное исполнение в потоке интерфейса (т.е. все события потока будут обрабатываться внутри event_loop.exec(), пока не завершится обработка вторым потоком).
1
266 / 81 / 18
Регистрация: 05.04.2018
Сообщений: 1,102
Записей в блоге: 1
07.06.2019, 22:41  [ТС] 4
когда отвечает, мистер TRam_, значит дело в шляпе!
0
07.06.2019, 22:41
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.06.2019, 22:41
Помогаю со студенческими работами здесь

Выполнение "non QObject" классов в отдельном потоке
Есть класс qObjClass_1, унаследованный от QObject. Данный класс имеет включенные в него простые (не...

Работа функции в отдельном потоке, с отрисовкой прогресса
При нажатии кнопки в форме, происходят некоторые вычисления. Причём, процесс вычисления связан с...

Вызов функции с двумя параметрами в новом потоке
public void Func(float A, float B){ } Thread myThreadMD1 = new Thread( Func( Aa, Bb)) ...

Выполнение функции в отдельном потоке
Вопрос конечно избитый, но толком ничего не нашел. Есть функция с кучей циклов и большими порогами....


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru