Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 在c++11线程中更新QT小部件_Multithreading_Qt_C++11 - Fatal编程技术网

Multithreading 在c++11线程中更新QT小部件

Multithreading 在c++11线程中更新QT小部件,multithreading,qt,c++11,Multithreading,Qt,C++11,我使用c++11 std::thread发出请求和响应,然后用响应更新QT lineedit。 我已经读到,从非gui线程更新QT小部件是非法的。 在某些代码中,它可以正常工作。 所以我认为QThread不能更新QT小部件,而c++11线程可以使用它 void MyWidget::on_button_clicked() { std::thread([this] { auto req = doSomeRequest(); req.Wait();

我使用c++11 std::thread发出请求和响应,然后用响应更新QT lineedit。 我已经读到,从非gui线程更新QT小部件是非法的。 在某些代码中,它可以正常工作。 所以我认为QThread不能更新QT小部件,而c++11线程可以使用它

void MyWidget::on_button_clicked() {
    std::thread([this] {
        auto req = doSomeRequest();
        req.Wait();
        auto res = req.response();

        ui->lineedit->setText(res.name());
        // emit updateName(res.name());
    }).detach();
}
但另一个例子,它给了我一个错误。 有人知道QT里面发生了什么吗

PC: @ 0x7f48d426bcda QFontEngineFT::loadGlyphSet() *** SIGSEGV (@0x10) received by PID 5484 (TID 0x7f48e4f39780) from PID 16; stack trace: *** @ 0x7f48dfde9390 (unknown) @ 0x7f48d426bcda QFontEngineFT::loadGlyphSet() @ 0x7f48d426bd39 QFontEngineFT::loadGlyphFor() @ 0x7f48d426d2cf QFontEngineFT::lockedAlphaMapForGlyph() @ 0x7f48e0a721a0 QRasterPaintEngine::drawCachedGlyphs() @ 0x7f48e0a74a07 QRasterPaintEngine::drawTextItem() @ 0x7f48e0a90905 (unknown) @ 0x7f48e091e988 QTextLine::draw() @ 0x7f48e091f79d QTextLayout::draw() @ 0x7f48e11ce733 QWidgetLineControl::draw() @ 0x7f48e1142e2b QLineEdit::paintEvent() @ 0x7f48e1051b78 QWidget::event() @ 0x7f48e11476f5 QLineEdit::event() @ 0x7f48e100c52c QApplicationPrivate::notify_helper() @ 0x7f48e1013220 QApplication::notify() @ 0x7f48e0266ae0 QCoreApplication::notifyInternal2() @ 0x7f48e104a54a QWidgetPrivate::sendPaintEvent() @ 0x7f48e104ab5f QWidgetPrivate::drawWidget() @ 0x7f48e104b8c4 QWidgetPrivate::paintSiblingsRecursive() @ 0x7f48e104b71a QWidgetPrivate::paintSiblingsRecursive() @ 0x7f48e104b71a QWidgetPrivate::paintSiblingsRecursive() @ 0x7f48e104b71a QWidgetPrivate::paintSiblingsRecursive() @ 0x7f48e104a702 QWidgetPrivate::drawWidget() @ 0x7f48e104b8c4 QWidgetPrivate::paintSiblingsRecursive() @ 0x7f48e104a702 QWidgetPrivate::drawWidget() @ 0x7f48e104b8c4 QWidgetPrivate::paintSiblingsRecursive() @ 0x7f48e104a702 QWidgetPrivate::drawWidget() @ 0x7f48e101b891 (unknown) @ 0x7f48e101baf1 (unknown) @ 0x7f48e103ba7f QWidgetPrivate::syncBackingStore() @ 0x7f48e1051c40 QWidget::event() @ 0x7f48e100c52c QApplicationPrivate::notify_helper() fish: “./aidmat ../aidmat.ini” terminated by signal SIGSEGV (Address boundary error)
从主线程以外的任何线程更新QWidgets都是非法的。它曾经在使用C++11线程时工作过的事实并不意味着它是合法的

请尝试以下操作之一:

QMetaObject::invokeMethod(ui->lineedit, "setText", Q_ARG(QString, res.name());
// OR
QString name = res.name();
QTimer::singleShot(0, ui->lineedit, [name, this](){ui->lineedit->setText(name);});

由于Qt的实现,您所做的是未定义的行为。实现和行为因平台而异。 thread类只是系统功能的包装器。QThread和类之间的关联是Qt体系结构的一部分,标准库与之无关,因此通过使用std::thread,您只是在欺骗Qt库开发人员告诉您不应该做的事情

若你们需要做你们正在尝试的事情,你们应该使用信号槽系统