查看完整版本: [-- 多线程UI显示消息问题 --]

QTCN开发网 -> Qt基础编程 -> 多线程UI显示消息问题 [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

mugua001 2021-07-15 13:33

多线程UI显示消息问题

UI的函数fun1(),是通过线程函数 nthread()   实例化后调用的。
结果:导至主线程函数  fun1()中 输出到文本框的内容,都不显示,只能qDebut()显示;
然后,在fun1()中通过 信号 ,启动其他函数fun2(),也不行,fun2() 也不在主线程中……
如何处理这种情况,让消息在文本框显示?
//-----------------------------
函数 sacMainWindow:: fun1()    //该函数由线程 函数调用。 sacMainWindow *p = new sacmainwindw;    p->fun1();
{
prnMsg("",false);
prnTxt("",true);
}

void sacMainWindow::prnMsg(QString qSrcStr)
{
    //ui->plainTextEdit_info ->appendPlainText(qSrcStr);
    //ui->plainTextEdit_txt->appendPlainText(qSrcStr);

    emit prnMsgSignal(qSrcStr, false);
    qDebug() << "PrnMsg thread:" << QThread::currentThreadId();
}
void sacMainWindow::prnTxt(QString qSrcStr)
{
    //ui->plainTextEdit_txt->clear();
    //ui->plainTextEdit_txt->appendPlainText(qSrcStr);

    emit prnMsgSignal(qSrcStr, true);
}
void sacMainWindow::prnMsgSlotFun(QString qSrcStr, bool cls)
{
    if(cls)
    {
        ui->plainTextEdit_txt->clear();
        ui->plainTextEdit_txt->appendPlainText(qSrcStr);
        qDebug() << "清屏消息." << qSrcStr;
    }
    else
    {
        ui->plainTextEdit_info ->appendPlainText(qSrcStr);
        ui->plainTextEdit_txt->appendPlainText(qSrcStr);
        qDebug() << "屏幕消息输出." << qSrcStr;
    }

    emit viewMsgSignal(qSrcStr, cls);
}
void sacMainWindow::viewMsgSlotFun(QString qSrcStr, bool cls)
{
    if(cls)
    {
        ui->plainTextEdit_txt->clear();
        ui->plainTextEdit_txt->appendPlainText(qSrcStr);
        qDebug() << "清屏消息2." << qSrcStr;
    }
}

mugua001 2021-07-15 13:34
connect(this, SIGNAL(prnMsgSignal(QString, bool)), this, SLOT(prnMsgSlotFun(QString, bool)), Qt::QueuedConnection);

fsu0413 2021-07-22 08:13
QueuedConnection也不一定好使吧,slot需要到主线程执行

mugua001 2021-07-22 09:56
fsu0413:QueuedConnection也不一定好使吧,slot需要到主线程执行 (2021-07-22 08:13) 

是的,不好使;

哪怕是用信号 记动的 槽函数,也是在  子线程里,而不是在 主线程中。郁闷中……

onlyone 2021-07-23 15:45
基础问题。

首先UI不能在非主线程中创建和调用,要想UI的文本框能显示消息,该对象必须在主线程中。

其他线程,通过emit信号的方式,发送信号给主线程。主线程收到后,把消息在文本框中显示。

viewMsgSlotFun函数,只能在主线程中,执行。


wuyuande 2021-07-23 17:03
用QMetaObject::invokeMethod试一下?

fsu0413 2021-07-24 08:33
mugua001:是的,不好使;
哪怕是用信号 记动的 槽函数,也是在  子线程里,而不是在 主线程中。郁闷中…… (2021-07-22 09:56) 

主线程开消息循环了吗,也就是说主线程执行过 qApp->exec()了吗

mugua001 2021-07-25 02:10
fsu0413:主线程开消息循环了吗,也就是说主线程执行过 qApp->exec()了吗 (2021-07-24 08:33) 

这个……需要怎么操作?

程序可以运行,只不过所在的线程不理想。

wwwfffhhh 2021-07-29 16:27
一般来讲不能在辅助线程修改屏幕窗口的显示内容的,如果需要修改,建议按照下面的方法
建议编程思路:
主线程编程
1.建立一个动态数组接收来自辅助线程的命令队列,并且这个命令队列受QMutex保护
2.调用connect(...)建立信号和槽函数对应
3.在槽函数中读取上方的动态数组命令队列,然后根据数组的命令进行信息显示

辅助线程编程:
1.进入上方QMutex对象,然后把需要的命令保存到上方的动态数组中
2.发送主线程对象的信号


查看完整版本: [-- 多线程UI显示消息问题 --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled