Qt学习day06 QT多线程(QThread) 线程同步 网络编程基础

一 QT多线程(QThread)
1 创建线程
1)方法一:QObject::moveToThread
class Worker : public QObject
{
Q_OBJECT
public slots:
//将来想在子线程中执行的函数
void doWork(…) {
/耗时或阻塞的操作/
}
};

class Controller : public QObject
{
Q_OBJECT
QThread workerThread;//创建子线程对象
public:
Controller() {
//创建需要放在子线程中工作的Work对象
Worker *worker = new Worker;
//将worker对象移动到子线程中
worker->moveToThread(&workerThread);
//通过信号触发worker的槽(dowork)在子线程执行
connect(this, &Controller::operate,
worker, &Worker::doWork);
//开启子线程
workerThread.start();
}
signals:
void operate(const QString &);
};

2)方法二:继承QThread,重写run函数
class WorkerThread:public QThread{
Q_OBJECT
void run()[virtual]{
/* 耗时或阻塞操作 */
}
};
WorkerThread workerThread
workerThread.start();//开启子线程

2 相关的成员函数
1)开启线程//类似pthread_create()
void start();
2)获取线程句柄(ID)//类似pthread_self()
Qt::HANDLE currentThreadId()
3)线程退出//类似pthread_exit
void exit();
void quit()[slots];
4)线程等待//类似pthread_join()
void wait();
5)线程终止//类似pthread_cancel
void terminate();

void run(){
	动态资源分配:new
	...被终止...
	动态资源释放: delete
}
-------------------
void run(){
	加锁:lock
	访问临界资源
	...被终止...
	访问临界资源结束
	解锁:unlock
}

6)设置线程是否允许被终止
//类似pthread_setcancelstate
void setTerminationEnabled(bool enabled = true)
eg:
void run(){
setTerminationEnabled(false);//不允许被终止
关键代码:动态资源,临时资源,数据库…
setTerminationEnabled(true);//恢复可以终止
}

案例:多线程打印消息
方法1:工程Thread1
方法2: 工程Thread2

二 线程同步
1 互斥锁(互斥量) QMutex
QMutex mutex;
void run(void){
mutex.lock();
访问临界资源…;
mutex.unlock();
}
void run(void){
mutex.lock();
访问临界资源…;
mutex.unlock();
}
--------------------
void run(void){
mutex.lock();

if(“error1”){
mutex.unlock();
return;
}

if(“error2”){
mutex.unlock();
return;
}
mutex.unlock();
}
---------------
QMutex mutex;
void run(void){
//mutex.lock();
QMutexLocker locker(&mutex)

if(“error1”){
return;
}

if(“error2”){
return;
}
}

2 读写锁 QReadWriteLock
eg:
void ReaderThread::run(){//读操作线程

lock.lockForRead();
read_file();
lock.unlock();

}
void WriterThread::run(){//写操作线程

lock.lockForWrite();
write_file();
lock.unlock();

}
3 信号量 QSemaphore
eg:
//创建信号量并初始化为5,表示有5个共享资源
QSemaphore sem(5);//sem.available() == 5
//获取3个共享资源,剩余2个可用共享资源
sem.acquire(3);//sem.available() == 2
//获取2个共享资源,剩余0个可用共享资源
sem.acquire(2);//sem.available() == 0
//释放5个共享资源,剩余5个可用共享资源
sem.release(5);// sem.available() == 5
//又分配5个共享资源,剩余10个可用共享资源
sem.release(5);// sem.available() == 10
//尝试获取1,成功,返回true
sem.tryAcquire(1);//sem.available()==9//true
//尝试获取250,失败,返回false
sem.tryAcquire(250);//sem.available()==9//false

4 条件变量 QWaitCondition//了解


三 网络编程基础
1 Linux TCP/IP 四层/五层,OSI七层模型
1)应用层 HTTP/FTP/TFTP/POP3/SMTP/TFTP…
2)表示层
3)会话层
4)传输层 TCP/UDP
5)网络层 IP
6)链路层
7)物理层

2 IP地址
1)概念:互联网中唯一的地址
2)IPv4(32位) IPv6(128位)
3)IP地址表示方式
–》点分十进制“192.168.15.100”
–》struct sockaddr_in{0xC0A80F64};
–》QHostAddress
4)查看主机IP的指令
–》linux/unix:ifconfig
–》window:ipconfig
5)判断两台主机是否能否通信
ping 对方主机地址;
6)特殊的IP地址
–》127.0.0.1//本地环回地址,常用于本地测试
–》255.255.255.255//广播地址
–》0.0.0.0 //任意网卡的地址

2 TCP编程模型C/S
1)服务器
–》创建通信套接字 socket()
–》准备服务地址 struct sockaddr{ip,port};
–》绑定 bind()
–》监听 listen()
–》等待客户端连接请求 int cfd=accept()
–》创建子进程/子线程
–》在子进程/子线程通信
while(1){
read()/write()
recv()/send()
}
–》关闭 close()

2)客户端
–》创建和服务器通信的套接字 socket
–》准备服务器的地址 struct sockaddr{ip,port}
–》向服务器发送连接请求 connect()
–》通信
while(1){
read()/write()
recv()/send()
}
–》关闭 close()

2 UDP编程模型C/S
1)服务器
–》创建通信套接字 socket()
–》准备服务地址 struct sockaddr{ip,port};
–》绑定 bind()
–》通信
recvfrom()/sendto()
–》关闭 close()

2)客户端
–》创建通信套接字 socket()
–》准备服务地址 struct sockaddr{ip,port};
–》通信
read()/recvfrom()/sendto()
–》关闭 close()

QT中和网络编程相关类:
QHostAddress //IP地址
QAbstractSocket //套接字基类
QUdpSocket //UDP套接字
QTcpSocket //TCP套接字
QTcpServer //TCP服务器

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值