最近做一个交互式的界面更新程序。用指令接收的线程去处理界面刷新的函数,发现会报错,并且界面也不刷新。经过百度,发现是线程安全问题。子线程是不可以处理主线程。发现有很多相关介绍,一个方法为 使用connect 方式的信号槽来处理。一个方式为moveToThread 来进行处理。我只完成了connect 方式,而moveToThread 没有通过验证,有通过的大神,请指教。
下面为我的代码结构。
一个为界面模型,里面包含 insert 函数。
beginInsertRows(QModelIndex(), index, index);
m_dataList.insert(index, data);
endInsertRows(); //这个为产生异常原因
一个为指令通信线程,接收从UI下传的指令。然后进行处理.
while(isRunning())
{
switch(cmd)
{
case INSERTDATA:
QVariant data(json);
emit signalToUpdate(data);
break;
}
}
采用connect 关联槽函数。
connect(this,&CmdProcess::signalToUpdate,this,&CmdProcess::startToUpdate);
void CmdProcess::startToUpdate(QVariant data)
{
QJsonObject msg = data.toJsonObject(); //采用了QJsonObject 需要进行类型转换。
Append(msg);
}
关于为什么需要线程,主要是防止在直接的回调里面会产生阻塞,从而导致界面卡顿。