找回密码
 立即注册
收起左侧

界面用鼠标一点就死怎么办?

1
回复
5735
查看
[复制链接]
累计签到:70 天
连续签到:1 天
来源: 2016-4-12 16:46:16 显示全部楼层 |阅读模式
10Qter豆
是一个实时刷新报文的界面 ,不点击情况下每次Timer回调函数里的while循环能处理以下数据各3条的样子。用的QTreeView与QStandardItemModel。 但是一点击界面,界面就卡死在while里了。
TX/RX         GramText   -》 这是表头

TX(682)  000000000000000000000000000000
RX(683)  000000000000000000000000000000
                 000000000000000000000000000000
                 000000000000000000000000000000
                 000000000000000000000000000000
                 000000000000000000000000000000
                 000000000000000000000000000000
                 000000000000000000000000000000
                 000000000000000000000000000000
                 000000000000000000000000000000
                 000000000000000000000000000000
                 000000000000000000000000000000

程序结构如下:
::OnFreshTimer()
{
远程调用数据
while(数据存在)
   {
                        m_StringList =数据内容;
                        numLines = 数据行数;
                        int nums = m_pDataModel->rowCount();
                       
                        if (nums >= POLL_MAX_ROWS)
                        {                       
                                for (int i = 0; i < numLines; i++)
                                {
                                        if (m_pDataModel->data(m_pDataModel->index(0,1)) != NULL)
                                        {
                                                m_pDataModel->removeRow(0);
                                                m_pDataModel->insertRow(nums-1);
                                        }
                                        m_pDataModel->setData(m_pDataModel->index(nums - 1, 1), QBrush(tmpColor), Qt::ForegroundRole);
                                        if(rtflag == FALSE)
                                        {
                                                        rtflag = TRUE;
                                                        m_pDataModel->setData(m_pDataModel->index(nums - 1, 0), tmpstr);
                                        }
                                        //else
                                        //{
                                                //m_pDataModel->setData(m_pDataModel->index(nums - 1, 0), "  ");
                                //        }
                                        m_pDataModel->setData(m_pDataModel->index(nums - 1, 1), m_StringList[i]);
                                }                       
                                numLines = 0;
                               
                        }
                        else
                        {
                                rtflag = TRUE;       

                                m_pDataModel->insertRow(nums);
                                m_pDataModel->setData(m_pDataModel->index(nums, 0), tmpstr);
                                m_pDataModel->setData(m_pDataModel->index(nums, 1), m_StringList[0]);
                                m_pDataModel->setData(m_pDataModel->index(nums, 1), QBrush(tmpColor), Qt::ForegroundRole);
                                m_pDataModel->setData(m_pDataModel->index(nums, 0), QBrush(QColor(0, 0, 0)), Qt::ForegroundRole);

                                numLines --;
                                if(numLines <= 0)
                                {
                                        break;
                                }
                                //for(int j=1;j<POLL_MAX_ROWS-nums;j++)
                                for (int j = 1; j<numLines; j++)
                                {       
                                        //if(numLines <= 0) break;
                                        if (m_pDataModel->rowCount()>=POLL_MAX_ROWS)
                                        {
                                                m_pDataModel->removeRow(0);
                                                m_pDataModel->insertRow(POLL_MAX_ROWS - 1);
                                                m_pDataModel->setData(m_pDataModel->index(POLL_MAX_ROWS - 1, 1), m_StringList[j]);
                                                m_pDataModel->setData(m_pDataModel->index(POLL_MAX_ROWS - 1, 1), QBrush(tmpColor), Qt::ForegroundRole);
                                               
                                        }
                                        else
                                        {
                                                m_pDataModel->insertRow(nums + j);
                                                //m_pDataModel->setData(m_pDataModel->index(nums + j, 0), "     ");
                                                m_pDataModel->setData(m_pDataModel->index(nums + j, 1), m_StringList[j]);
                                                m_pDataModel->setData(m_pDataModel->index(nums + j, 1), QBrush(tmpColor), Qt::ForegroundRole);
                                                //m_pDataModel->setData(m_pDataModel->index(nums + j, 0), QBrush(QColor(0, 0, 0)), Qt::ForegroundRole);                               
                                        }
                                       
                                }
                          }
                        ui->m_ListView->scrollToBottom();
                        ui->m_ListView->update();
               }
             调远程数据
   }
}

就是这个最外层的while。当不点击鼠标的情况下,while大概每循环6次就能跳出来(即将远程的数据处理完毕显示于界面)。点击鼠标后,大概1秒后,这个循环就跳不出来了,是不是事件阻塞了?  有什么办法能优化么?
               

               

回复

使用道具 举报

累计签到:70 天
连续签到:1 天
2016-4-15 09:29:45 显示全部楼层
最终 ,将数据获取与处理放入线程来做。(定义个结构体存放数据。)处理完model更新数据就好。遇到因为处理速度过快,界面显示不过来(鼠标移动到哪才会更新移动的那块区域)。最后又调了一个50ms的 定时器, scrollToIndex()与ui->treeview->viewport()->repaint() 定时刷xin 界面。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了