做暖网站,做企业网站哪个平台好,网络营销的重点,龙岩网站设计招聘信息文章目录 Qt系统相关1. 多线程1.1 Qt多线程介绍1.2 常用函数1.3 线程安全 2. 网络2.1 UDP Socket2.2 TCP Socket Qt 系统相关
1. 多线程
1.1 Qt多线程介绍 QThread 代表一个在应用程序中可以独立控制的线程#xff0c;它还可以和进程中的其他线程共享数据。QThread 对象管理… 文章目录 Qt系统相关1. 多线程1.1 Qt多线程介绍1.2 常用函数1.3 线程安全 2. 网络2.1 UDP Socket2.2 TCP Socket Qt 系统相关
1. 多线程
1.1 Qt多线程介绍 QThread 代表一个在应用程序中可以独立控制的线程它还可以和进程中的其他线程共享数据。QThread 对象管理程序中的一个控制线程。 1.2 常用函数
函数 / 信号名功能描述run()线程的入口函数包含线程执行的代码逻辑start()调用 run () 开始执行线程根据优先级调度若线程已运行则不做任何事currentThread()返回指向管理当前执行线程的 QThread 指针isRunning()线程正在运行则返回 true否则返回 falsesleep()使线程休眠单位为秒msleep()使线程休眠单位为毫秒usleep()使线程休眠单位为微秒wait()阻塞线程直到关联线程完成执行从 run () 返回若已完成或未启动则返回 true或达到指定时间超时返回 false默认 ULONG_MAX 表示永远等待类似 POSIX pthread_join () 功能terminate()终止线程执行是否立即终止取决于操作系统调度策略之后建议用 wait ()finished()线程结束时发出此信号可用于线程清理工作 timethread.h
#ifndef TIMETHREAD_H
#define TIMETHREAD_H#include QThreadclass TimeThread : public QThread
{Q_OBJECTpublic:TimeThread();void run(); //线程任务函数signals:void sendTime(QString Time); //声明信号函数
};#endif // TIMETHREAD_H widget.h
#ifndef WIDGET_H
#define WIDGET_H#include QWidget
#include timethread.h //添加头文件
#include QLabelQT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();void on_btn_clicked();void showTime(QString Time);private:QLabel* label;Ui::Widget *ui;TimeThread t; //定义线程对象
};
#endif // WIDGET_Htimethread.cpp
#include timethread.h#include QTime
#include QDebug
#include QStringTimeThread::TimeThread() {}void TimeThread::run()
{while(1){QString time QTime::currentTime().toString(hh:mm:ss);qDebug() time;emit sendTime(time); //发送信号sleep(1);}
}widget.cpp
#include widget.h
#include ui_widget.h#include timethread.h
#include QGridLayout
#include QLabel
#include QPushButton
#include QSpacerItemWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);QGridLayout* layoutnew QGridLayout();labelnew QLabel(this);label-setFixedSize(500,300);label-setFrameShape(QFrame::Box);label-setText(SSSSSSSSSSSSSSSSSSSS);QPushButton* btnnew QPushButton(this);btn-setFixedSize(100,50);btn-setText(确定);layout-addWidget(label,0,0,1,1);layout-addWidget(btn,1,0,1,1);this-setLayout(layout);connect(t,TimeThread::sendTime,this,Widget::showTime);connect(btn,QPushButton::clicked,this,Widget::on_btn_clicked);
}Widget::~Widget()
{delete ui;
}void Widget::on_btn_clicked()
{t.start(); //开启线程
}void Widget::showTime(QString Time)
{label-setText(Time);
} 连接类型说明适用场景注意事项Qt::AutoConnection根据信号和槽所在线程自动选择连接类型同线程用 Qt::DirectConnection不同线程用 Qt::QueuedConnection通用场景无Qt::DirectConnection信号发出时槽函数立即在同线程执行信号和槽在同一线程注意线程安全性Qt::QueuedConnection信号发出时槽函数插入接收对象所属线程事件队列下次事件循环执行信号和槽在不同线程确保线程安全Qt::BlockingQueuedConnection与 Qt::QueuedConnection 类似但发送信号线程会阻塞至槽函数执行完毕需等待槽函数执行完再继续的场景注意可能引起线程死锁Qt::UniqueConnection可与其他连接类型位或组合使用用于保证相同信号和槽之间只有一个连接无 1.3 线程安全 实现线程互斥和同步常用的类有 • 互斥锁QMutex、QMutexLocker • 条件变量QWaitCondition • 信号量QSemaphore • 读写锁QReadLocker、QWriteLocker、QReadWriteLock QMutex互斥锁
函数功能描述QMutex()创建互斥锁。~QMutex()销毁互斥锁。lock()获取锁阻塞等待。tryLock()尝试获取锁不阻塞。unlock()释放锁。recursiveLock()递归锁获取递归锁。tryRecursiveLock()尝试获取递归锁。unlockRecursive()释放递归锁。 QMutexLocker互斥锁辅助类
函数功能描述QMutexLocker(QMutex * mutex)构造时尝试获取互斥锁。~QMutexLocker()析构时释放互斥锁。relock()重新获取互斥锁。unlock()手动释放互斥锁。 QWaitCondition条件变量
函数功能描述QWaitCondition()创建条件变量。~QWaitCondition()销毁条件变量。wait(QMutex * mutex)线程等待释放互斥锁被唤醒后重新获取。wait(QMutex * mutex, ulong time)等待指定时间超时返回 false。wakeOne()唤醒一个等待线程。wakeAll()唤醒所有等待线程。 QSemaphore信号量
函数功能描述QSemaphore(int n 0)创建信号量设置初始值。~QSemaphore()销毁信号量。acquire(int n 1)获取 n 个资源阻塞等待。tryAcquire(int n 1)尝试获取 n 个资源不阻塞。release(int n 1)释放 n 个资源。 QReadLocker读写锁 - 读操作辅助类
函数功能描述QReadLocker(QReadWriteLock * lock)构造时获取读锁。~QReadLocker()析构时释放读锁。relock()重新获取读锁。unlock()手动释放读锁。 QWriteLocker读写锁 - 写操作辅助类
函数功能描述QWriteLocker(QReadWriteLock * lock)构造时获取写锁。~QWriteLocker()析构时释放写锁。relock()重新获取写锁。unlock()手动释放写锁。 QReadWriteLock读写锁
函数功能描述QReadWriteLock()创建读写锁。~QReadWriteLock()销毁读写锁。lockForRead()获取读锁阻塞。tryLockForRead()尝试获取读锁不阻塞。unlock()释放锁。lockForWrite()获取写锁阻塞。tryLockForWrite()尝试获取写锁不阻塞。 2. 网络
2.1 UDP Socket
QUdpSocket
名称类型说明对标原生 APIbind(const QHostAddress, quint16)方法绑定指定的端口号bindreceiveDatagram()方法返回 QNetworkDatagram读取一个 UDP 数据报recvfromwriteDatagram(const QNetworkDatagram)方法发送一个 UDP 数据报sendtoreadyRead信号在收到数据并准备就绪后触发无类似 IO 多路复用的通知机制 QNetworkDatagram
名称类型说明对标原生 APIQNetworkDatagram(const QByteArray, const QHostAddress, quint16)构造函数通过 QByteArray、目标 IP 地址、目标端口号构造一个 UDP 数据报通常用于发送数据时无data()方法获取数据报内部持有的数据返回 QByteArray无senderAddress()方法获取数据报中包含的对端的 IP 地址无recvfrom 包含该功能senderPort()方法获取数据报中包含的对端的端无recvfrom 包含该功能 服务端 widget.h
#ifndef WIDGET_H
#define WIDGET_H#include QWidget
#include QUdpSocketQT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();QUdpSocket* socket;void processRequest();QString process(const QString);private:Ui::Widget *ui;
};
#endif // WIDGET_Hwidget.cpp
#include widget.h
#include ui_widget.h#include QMessageBox
#include QUdpSocket
#include QNetworkDatagramWidget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);// 1. 设置窗⼝标题this-setWindowTitle(服务器);// 2. 实例化 socketsocket new QUdpSocket(this);// 3. 连接信号槽, 处理收到的请求connect(socket, QUdpSocket::readyRead, this, Widget::processRequest);// 4. 绑定端⼝bool ret socket-bind(QHostAddress::Any, 9090);if (!ret) {QMessageBox::critical(nullptr, 服务器启动出错, socket-errorString());return;}
}Widget::~Widget()
{delete ui;
}void Widget::processRequest()
{// 1. 读取请求const QNetworkDatagram requestDatagram socket-receiveDatagram();QString request requestDatagram.data();// 2. 根据请求计算响应const QString response process(request);// 3. 把响应写回到客户端QNetworkDatagram responseDatagram(response.toUtf8(),requestDatagram.senderAddress(), requestDatagram.senderPort());socket-writeDatagram(responseDatagram);// 显示打印日志QString log [ requestDatagram.senderAddress().toString() : QString::number(requestDatagram.senderPort()) ] req: request , resp: response;ui-listWidget-addItem(log);
}QString Widget::process(const QString request)
{return request;
} 客户端 widget.h
#ifndef WIDGET_H
#define WIDGET_H#include QWidget
#include QUdpSocketQT_BEGIN_NAMESPACE
namespace Ui {
class Widget;
}
QT_END_NAMESPACEclass Widget : public QWidget
{Q_OBJECTpublic:Widget(QWidget *parent nullptr);~Widget();private slots:void on_pushButton_clicked();private:Ui::Widget *ui;// 创建 socket 成员QUdpSocket* socket;
};
#endif // WIDGET_Hwidget.cpp
#include widget.h
#include ui_widget.h#include QNetworkDatagram// 提前定义好服务器的 IP 和 端⼝
const QString SERVER_IP 127.0.0.1;
const quint16 SERVER_PORT 9090;Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui-setupUi(this);// 1. 设置窗口名字this-setWindowTitle(客户端);// 2. 实例化 socketsocket new QUdpSocket(this);connect(socket, QUdpSocket::readyRead, this, []() {const QNetworkDatagram responseDatagram socket-receiveDatagram();QString response responseDatagram.data();ui-listWidget-addItem(QString(服务器说: ) response);});
}Widget::~Widget()
{delete ui;
}void Widget::on_pushButton_clicked()
{// 1. 获取到输⼊框的内容const QString text ui-lineEdit-text();// 2. 构造请求数据QNetworkDatagram requestDatagram(text.toUtf8(), QHostAddress(SERVER_IP),SERVER_PORT);// 3. 发送请求socket-writeDatagram(requestDatagram);// 4. 消息添加到列表框中ui-listWidget-addItem(客⼾端说: text);// 5. 清空输⼊框ui-lineEdit-setText();
} 2.2 TCP Socket
QTcpServer
名称类型说明对标原生 APIlisten(const QHostAddress, quint16 port)方法绑定指定地址和端口号并开始监听bind 和 listennextPendingConnection()方法从系统获取已建立好的 tcp 连接返回 QTcpSocket 用于和客户端通信acceptnewConnection信号新客户端连接建立好后触发无类似 IO 多路复用通知机制 QTcpSocket
名称类型说明对标原生 APIreadAll()方法读取接收缓冲区所有数据返回 QByteArrayreadwrite(const QByteArray)方法将数据写入 socketwritedeleteLater方法标记 socket 对象无效在下个事件循环析构释放无类似 “半自动垃圾回收”readyRead信号数据到达且准备就绪时触发无类似 IO 多路复用通知机制disconnected信号连接断开时触发无类似 IO 多路复用通知机制 文章转载自: http://www.morning.tmxfn.cn.gov.cn.tmxfn.cn http://www.morning.qgjxt.cn.gov.cn.qgjxt.cn http://www.morning.dpnhs.cn.gov.cn.dpnhs.cn http://www.morning.mbnhr.cn.gov.cn.mbnhr.cn http://www.morning.nbqwt.cn.gov.cn.nbqwt.cn http://www.morning.jxwhr.cn.gov.cn.jxwhr.cn http://www.morning.csgwd.cn.gov.cn.csgwd.cn http://www.morning.attorneysportorange.com.gov.cn.attorneysportorange.com http://www.morning.lwnb.cn.gov.cn.lwnb.cn http://www.morning.dfqmy.cn.gov.cn.dfqmy.cn http://www.morning.rqlbp.cn.gov.cn.rqlbp.cn http://www.morning.cxlys.cn.gov.cn.cxlys.cn http://www.morning.flmxl.cn.gov.cn.flmxl.cn http://www.morning.kjawz.cn.gov.cn.kjawz.cn http://www.morning.zsleyuan.cn.gov.cn.zsleyuan.cn http://www.morning.mrtdq.cn.gov.cn.mrtdq.cn http://www.morning.xpzgg.cn.gov.cn.xpzgg.cn http://www.morning.drpbc.cn.gov.cn.drpbc.cn http://www.morning.jljwk.cn.gov.cn.jljwk.cn http://www.morning.nwbnt.cn.gov.cn.nwbnt.cn http://www.morning.gtjkh.cn.gov.cn.gtjkh.cn http://www.morning.xzqzd.cn.gov.cn.xzqzd.cn http://www.morning.xgzwj.cn.gov.cn.xgzwj.cn http://www.morning.bdypl.cn.gov.cn.bdypl.cn http://www.morning.lkrmp.cn.gov.cn.lkrmp.cn http://www.morning.bszmy.cn.gov.cn.bszmy.cn http://www.morning.ybgt.cn.gov.cn.ybgt.cn http://www.morning.yfrlk.cn.gov.cn.yfrlk.cn http://www.morning.mkkcr.cn.gov.cn.mkkcr.cn http://www.morning.srrzb.cn.gov.cn.srrzb.cn http://www.morning.c7501.cn.gov.cn.c7501.cn http://www.morning.xshkh.cn.gov.cn.xshkh.cn http://www.morning.nbsbn.cn.gov.cn.nbsbn.cn http://www.morning.nwclg.cn.gov.cn.nwclg.cn http://www.morning.dkbsq.cn.gov.cn.dkbsq.cn http://www.morning.lanyee.com.cn.gov.cn.lanyee.com.cn http://www.morning.bzcjx.cn.gov.cn.bzcjx.cn http://www.morning.chmkt.cn.gov.cn.chmkt.cn http://www.morning.mjwnc.cn.gov.cn.mjwnc.cn http://www.morning.neletea.com.gov.cn.neletea.com http://www.morning.lynkz.cn.gov.cn.lynkz.cn http://www.morning.enjoinfo.cn.gov.cn.enjoinfo.cn http://www.morning.tbnpn.cn.gov.cn.tbnpn.cn http://www.morning.gydsg.cn.gov.cn.gydsg.cn http://www.morning.rbrd.cn.gov.cn.rbrd.cn http://www.morning.trjr.cn.gov.cn.trjr.cn http://www.morning.gnkdp.cn.gov.cn.gnkdp.cn http://www.morning.zsthg.cn.gov.cn.zsthg.cn http://www.morning.lfdmf.cn.gov.cn.lfdmf.cn http://www.morning.fpqq.cn.gov.cn.fpqq.cn http://www.morning.jydhl.cn.gov.cn.jydhl.cn http://www.morning.xqkcs.cn.gov.cn.xqkcs.cn http://www.morning.ktskc.cn.gov.cn.ktskc.cn http://www.morning.pyswr.cn.gov.cn.pyswr.cn http://www.morning.qpnb.cn.gov.cn.qpnb.cn http://www.morning.bgqqr.cn.gov.cn.bgqqr.cn http://www.morning.qkxt.cn.gov.cn.qkxt.cn http://www.morning.xrwbc.cn.gov.cn.xrwbc.cn http://www.morning.lbssg.cn.gov.cn.lbssg.cn http://www.morning.wzjhl.cn.gov.cn.wzjhl.cn http://www.morning.rbgqn.cn.gov.cn.rbgqn.cn http://www.morning.llxqj.cn.gov.cn.llxqj.cn http://www.morning.sdecsd.cn.gov.cn.sdecsd.cn http://www.morning.wcqkp.cn.gov.cn.wcqkp.cn http://www.morning.gbfzy.cn.gov.cn.gbfzy.cn http://www.morning.lfpzs.cn.gov.cn.lfpzs.cn http://www.morning.gpkjx.cn.gov.cn.gpkjx.cn http://www.morning.zyslyq.cn.gov.cn.zyslyq.cn http://www.morning.lqlc.cn.gov.cn.lqlc.cn http://www.morning.rhsg.cn.gov.cn.rhsg.cn http://www.morning.qkpzq.cn.gov.cn.qkpzq.cn http://www.morning.ssqrd.cn.gov.cn.ssqrd.cn http://www.morning.bwttj.cn.gov.cn.bwttj.cn http://www.morning.sgbk.cn.gov.cn.sgbk.cn http://www.morning.lgphx.cn.gov.cn.lgphx.cn http://www.morning.dwmmf.cn.gov.cn.dwmmf.cn http://www.morning.mczjq.cn.gov.cn.mczjq.cn http://www.morning.jfwrf.cn.gov.cn.jfwrf.cn http://www.morning.nfbxgtj.com.gov.cn.nfbxgtj.com http://www.morning.ruifund.com.gov.cn.ruifund.com