1. 程式人生 > >上位機與下位機程式配合是 下位機程式崩潰

上位機與下位機程式配合是 下位機程式崩潰

   最近作為一個菜鳥,一直測試同事用QT寫好的上位機與下位機程式, 結果配置一個模組,連續點選多次下載時,下位機出現程式崩潰的情況。如圖


根據提示得知


在下位機執行緒沒有結束的時候,我通過上位機就把內容情況了。 下位機執行緒繼續執行的時候,程式就崩了。

下位機程式處理:

  //串列埠執行緒停止,釋放記憶體
    for(int i=0; i<SERIAL_PORT_NUM; i++)
    {
        if(m_serialThread[i]->isRunning())
        {
            m_serialThread[i]->ControlRun(false);
//m_serialThread[i]->wait(3000);      更改之前的內容
//m_serialThread[i]->quit();   更改之前的內容
m_serialThread[i]->terminate();   更改加的一句話   強行退出。
        }
        m_serialThread[i]->ClearSerial();
    }

上位機處理,在下載未成功的時候不允許繼續點選下載。

...

QDataStreamout(&m_sendBlock,QIODevice::WriteOnly);
SaveConfig(out);//內容
SendBlock(Command_Down_Config);
AppandLog(tr("正在下載配置……%1"));
ui->downAction->setEnabled(false);    新加的一句話,下載進行時,按鈕變灰。
......
caseCommand_Down_Config:
{
AppandLog(tr("下載配置成功!"));
ui->downAction
->setEnabled(true); 下載成功後,下載按鈕回覆正常。
}
break;

在後續的測試過程中,上位機下載配置到下位機時,程式中的讀取串列埠程式會出現問題,說明強行終止會引起一些問題。  又將程式碼進行了一些優化

//串列埠執行緒停止,釋放記憶體
for(inti=0;i<SERIAL_PORT_NUM;i++)
{
if(m_serialThread[i]->isRunning())
{
m_serialThread[i]->ControlRun(false);
m_serialThread[i]->quit();    先退出
m_serialThread
[i]->wait(20000); 再等待20s
m_serialThread[i]->terminate();    最後再做一次強行終止,保證不留隱患
}
m_serialThread[i]->ClearSerial();
}

上位機下載或上裝程式時,不允許其他操作。如下:

AppandLog(tr("正在上裝配置……"));
ui->mainToolBar->setEnabled(false);    整個框變灰
AppandLog(tr("下載配置成功!"));
ui->mainToolBar->setEnabled(true);   下載完成後,恢復正常