在寫UDP接收程式時,接收是一個單獨的子執行緒,然后當接收到的資料達到一定的量后,發送到另一個子執行緒中去執行處理程序,下面是我的接收執行緒的代碼:
while (myUdpSocket->hasPendingDatagrams())
{
QByteArray tempArray;
quint64 size = myUdpSocket->pendingDatagramSize();
tempArray.resize(size);
myUdpSocket->readDatagram(tempArray.data(), tempArray.size());
if(tempArray!="End!") //每一幀資料發完后會再發一次“End!”
{
Num_recvData += tempArray.size(); // Num_recvData是指的記錄接收資料的位元組數
array_recv.append(tempArray); //array_recv全域QByteArray 變數,
emit sig_recv_byteNum(Num_recvData); //接收位元組數信號,通過該信號發送到UI執行緒中
if(array_recv.size() >=sizeof(recvData_struct)) //當接收資料的位元組數達到要求,將其發送到處理執行緒去處理
{
emit sig_recv_finish(array_recv); //發送一幀接收完成信號
array_recv.clear();
qDebug()<<"recv_success!";
}
}
}
問題就出在emit sig_recv_finish (array_recv)這里,中斷在下面的QMetaObject::activate(this, &staticMetaObject, 2, _a)這一句,并且報錯0xC0000005: 讀取位置 0x00000024 時發生訪問沖突。
// SIGNAL 2
void recvThread::sig_recv_finish(QByteArray _t1)
{
void *_a[] = { Q_NULLPTR, const_cast<void*>(reinterpret_cast<const void*>(&_t1)) };
QMetaObject::activate(this, &staticMetaObject, 2, _a);
}
找了好長時間只發現一個類似的帖子,但是好像沒用,
其實不止這一個信號,UI執行緒當我發送清零信號到子執行緒中去也是這個錯誤,所以請問下各位該怎么解決這種問題。
uj5u.com熱心網友回復:
你頭檔案也沒有,誰知道你這個信號和曹函式怎么定義的啊。再說了,既然是全域物件,你都沒必要當引數傳。uj5u.com熱心網友回復:
說錯了,不是全域變數,只不過在頭檔案里宣告了而已,對不起,我是個新手,剛學沒多久。至于信號和槽函式,信號就是下面這個,信號不需要定義吧,至于槽函式我因為是這個信號提示錯誤的,所以我以為跟槽函式沒關系
連接函式在UI執行緒:
connect(myrecvThread, &recvThread::sig_recv_finish, myhandleThread, &handleThread::handleData); //第一個引數時接收執行緒變數,第三個數處理執行緒變數
信號:
signals:
void sig_recv_finish(QByteArray);
槽函式:
void handleThread::handleData(QByteArray recv_data)
{
QByteArray array=recv_data;
msg = (recvData_struct*)array.data(); //將接收來的資料轉化為結構體
if((msg->m_frame_head[0]==QString("55").toInt(&ok,16))&&(msg->m_frame_end[0]==QString("59").toInt(&ok,16))) //對幀頭幀尾簡單的識別
{
中間就是各種處理了,如果需要貼我再貼吧,主要是我覺得都沒進入這個從處理槽函式中來。。
}
}
還有一點,我傳的是影像,每次第一幀影像都能接收到,也能顯示出來,但是到了第二幀就會程式蹦了,然后提示那個信號錯誤。
uj5u.com熱心網友回復:
估計是程式的邏輯設計的有問題轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/283324.html
標籤:Qt
