qt udp多线程收发过程_! udp多线程的有关问题
求助! udp多線程的問題
我做了個udp接收的測試程序,剛開始能收到數據,收了幾條數據之后就報個錯:
QSocketNotifier:?Socket?notifiers?cannot?be?enabled?or?disabled?from?another?thread
然后程序就收不到數據了,但是程序沒有崩潰。用的是qt5.4
各位能幫我看下嗎,感激不盡!
代碼如下:
mainwindow.h
#ifndef?MAINWINDOW_H
#define?MAINWINDOW_H
#include?
#include?"udpthread.h"
namespace?Ui?{
class?MainWindow;
}
class?MainWindow?:?public?QMainWindow
{
Q_OBJECT
public:
explicit?MainWindow(QWidget?*parent?=?0);
~MainWindow();
public?slots:
void?showmessages(QString?messages);
private?slots:
void?on_pushButton_clicked();
private:
Ui::MainWindow?*ui;
UdpThread?*myUdpThread;
};
#endif?//?MAINWINDOW_H
udpthread.h
#ifndef?UDPTHREAD_H
#define?UDPTHREAD_H
#include?
#include?
#include?
class?UdpThread?:?public?QThread
{
Q_OBJECT
public:
UdpThread(QObject?*parent=0);
~UdpThread();
void?run()Q_DECL_OVERRIDE;
signals:
void?showmessages(QString?messages);
private?slots:
void?readPendingDatagrams();
private:
QUdpSocket?*myUdpSocket;
};
#endif?//?UDPTHREAD_H
mainwindow.cpp
#include?"mainwindow.h"
#include?"ui_mainwindow.h"
#include?
MainWindow::MainWindow(QWidget?*parent)?:
QMainWindow(parent),
ui(new?Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~MainWindow()
{
delete?ui;
}
void?MainWindow::showmessages(QString?messages)????//顯示數據
{
ui->textEdit->append(messages);
}
void?MainWindow::on_pushButton_clicked()?????//開啟udp
{
myUdpThread=new?UdpThread(this);
connect(myUdpThread,?SIGNAL(showmessages(QString)),
this,?SLOT(showmessages(QString)));
myUdpThread->start();
}
udpthread.cpp
#include?"udpthread.h"
#include?
UdpThread::UdpThread(QObject?*parent)
:QThread(parent)
{
}
UdpThread::~UdpThread()
{
this->myUdpSocket->deleteLater();
quit();
wait();
}
void?UdpThread::run()
{
qDebug()<
myUdpSocket=new?QUdpSocket();
if(myUdpSocket->bind(60004,?QUdpSocket::ShareAddress?|??//綁定
QUdpSocket::ReuseAddressHint?)){
qDebug()<
}
else?{
qDebug()<
return;
}
connect(myUdpSocket,?SIGNAL(readyRead()),
this,?SLOT(readPendingDatagrams()));
exec();
}
void?UdpThread::readPendingDatagrams()
{
while(myUdpSocket->hasPendingDatagrams()){
QByteArray?datagram;
datagram.resize(myUdpSocket->pendingDatagramSize());
qDebug()<
myUdpSocket->readDatagram(datagram.data(),?datagram.size());?//接收數據(根據qDebug信息,就是執行這條語句報錯!!!)
qDebug()<
emit?showmessages(datagram);?//顯示數據
}
}
下面是調試信息:
run
bind_success
readPendingDatagrams-1
readPendingDatagrams-2
readPendingDatagrams-1
readPendingDatagrams-2
readPendingDatagrams-1
readPendingDatagrams-2
readPendingDatagrams-1
readPendingDatagrams-2
readPendingDatagrams-1
readPendingDatagrams-2
readPendingDatagrams-1
QSocketNotifier:?Socket?notifiers?cannot?be?enabled?or?disabled?from?another?thread
readPendingDatagrams-2
------解決思路----------------------
你的signal是另外一個線程發出的??而你的UI是主線程??主線程里不要綁定非UI線程的signal??而應該受到這個signal后?再次拋出一個signal去調用主線程的slot
------解決思路----------------------
目測這樣寫應該可以解決問題.
connect(myUdpSocket,?SIGNAL(readyRead()),
this,?SLOT(readPendingDatagrams()),?Qt::DirectConnection);
總結
以上是生活随笔為你收集整理的qt udp多线程收发过程_! udp多线程的有关问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何查看jinja2模板的上級_如何使用
- 下一篇: linux 关闭redis 命令_red