Запуск нового потока блокирует основное приложение

#c #qt #qthread

#c #qt #qthread

Вопрос:

Я пытаюсь использовать новый поток для выполнения некоторых запросов и обработки данных с некоторых веб-сайтов, но когда я запускаю поток в главном окне, графический интерфейс не отображается (я ничего не вижу).

Вот часть соответствующего кода:

 MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->tableView->setModel(amp;shopItems);
    QThread thread;
    thread.setObjectName("thread");

    a.address = ui->address;
    a.Filter = ui->filter;
    a.browsers = ui->browsers;
    a.excel = ui->excel;
    a.shopItems = amp;shopItems;
    a.moveToThread(amp;thread);
    connect(ui->dataPull, SIGNAL(clicked()), amp;a, SLOT (pull_data()));
    connect(ui->excel, SIGNAL(clicked()), this, SLOT(export_to_excel()));
    connect(ui->stop, SIGNAL(clicked()), this, SLOT(Stop()));
    //thread.start();
    //thread.wait();
}
  

Я думаю, это происходит потому, что, когда я использую thread.start() цикл событий переносится в новый поток.

Есть идеи, как запустить новый другой поток, сделав основной поток запущенным и отзывчивым?

Комментарии:

1. Ваш QThread имеет локальную область видимости в MainWindow конструкторе и будет уничтожен, как только конструктор завершится. Попробуйте QThread вместо этого создать MainWindow элемент a .

2. Из ссылки на QThread деструктор : «Удаление запущенного QThread … приведет к сбою программы «. Поэтому, если вы запустите поток и не дождетесь его завершения (а ожидание остановит всю программу), ваша программа завершится сбоем. Действительно, вместо этого определите поток как член MainWindow класса.

3. Да, я сделал QThread членом MainWindow, и он работает