linux高级编程day13 笔记
回顾:
线程与进程
1.进程由于资源独立,进程的主要关注是解决资源共享
2.线程先天是数据共享,线程主要关注共享数据脏
1.互斥量(线程内)
读写锁
2.信号/条件量调度(线程之间)
信号量
一.线程的信号量
1.定义信号量sem_t
2.初始化信号量sem_init
3.操作信号量sem_post sem_wait
4.释放信号量sem_destroy
5.其他函数sem_getvalue
案例:
创建一个子线程
子线程-信号量(阻塞)
主线程+信号量(解除阻塞)
体会:
信号量可以累加
+-操作单位是1

#include <pthread.h> #include <semaphore.h> #include <stdio.h> sem_t sem;// void *run(void*d) { while(1) { //3. sem_wait(&sem); printf("解除\n"); } } main() { pthread_t tid; //2 sem_init(&sem,0,5); pthread_create(&tid,0,run,0); while(1) { // sleep(1); sem_post(&sem); } }
一开始打印5次,然后每隔一秒打印一次。
作业:
摇奖程序,继续暂停7位随机数
信号量/条件量/信号?
目的:选择哪种技术实现?
1.无法使用互斥与读写锁实现.
2.信号实现不稳定.
3.没有互斥建议不考虑条件量.
4.最佳选择信号灯.
二.线程的读写锁(自学)
pthread_rwlock_t;
pthread_rwlock_init;
pthread_rwlock_destroy;
pthread_rwlock_rdlock;
pthread_rwlock_wrlock;
pthread_rwlock_unlock;
读读兼容
写写互斥
读写互斥
作用主要是为IO操作设计.
三.线程私有数据(了解)
pthread_key_create
pthread_key_delete
四.QT
1.工具
assistant 帮助文档
qtconfig QT配置工具
qmake QT的make与项目文件智能创建工具
uic UI界面的设计文件的编译工具
moc moc代码创建工具
designer UI设计工具
2.QT 的模块
qtcore
qtgui
qtnetwork
qtsvg
qtopengl
3.第一QT程序
1.QT编程模型
2.QT程序编译过程
3.QT的项目组织

#include <QApplication> #include <QDialog> int main(int args,char **argv) { //qmake -project //qmake **.pro //make //执行程序 QApplication app(args,argv); //将main的参数传进去 //////////////////////////// //在这里可以随便创建窗体 QDialog dlg; dlg.setVisible(true); //////////////////////////// return app.exec();//等待所有子线程结束,才能结束 }
注意:
1.QT是C++程序.
2.QT程序要启动QT的环境QApplication
3.编程的模型
qmake -project
qmake *.pro
make
执行
4.*.pro文件
TEMPLATE=
:app 应用程序
:lib 库
SOURCES=
:cpp文件1 cpp文件2 cpp文件3 ....
:\ 续行符号
:SOURCES+=
HEADERS=
:h头文件
CONFIG= 影响gcc的选项
:release | debug
:warn_on | warn_off -Wall -w
:qt | opengl
:shared | static
QT= (该变量在CONFIG=qt才有意义)
:core
:gui
:network
:opengl
:svg
:xml
:sql
TARGET=
:输出文件名 (-o输出文件)
LIBS=用户指定库
:-l -L
FORMS=ui文件
小例子:

TEMPLATE=app SOURCES=main.cpp HEADERS= CONFIG=qt release QT=core gui TARGET=main LIBS=-L.
5.怎么学习QT
QT类的结构层次.
QT的信号signal与槽slot.
QT基本组件
QT的UI设计器
五.直观认识QT
封装与帮助文档的使用
1.文档的组成部分:
1.模块
2.类作用简单描述
3.头文件
4.父类与派生类
5.构造器/析构器()
6.共有函数
7.属性
2.乱码处理
QT提供翻译机制
QTextCodec

#include <QApplication> #include <QDialog> #include <QPushButton> #include <QTextCodec> #include <QLineEdit> int main(int args,char**argv) { QApplication app(args,argv); QTextCodec *codec=QTextCodec::codecForName("gb2312"); QTextCodec::setCodecForTr(codec); QDialog dlg; dlg.resize(400,300); dlg.move((1024-400)/2,(768-300)/2); QPushButton btn(&dlg); btn.resize(100,30); btn.move(100,100); btn.setText(QObject::tr("确定")); //转码,防止乱码 QLineEdit edt(&dlg); edt.resize(100,30); edt.move(100,200); edt.setText(QObject::tr("确定")); dlg.setVisible(true); return app.exec(); }
pro文件的编写:

TEMPLATE=app SOURCES=main.cpp CONFIG=release qt QT=core gui TARGET=main
3.代码组织
以窗体为基本单位的封装
案例:
登录
QDialog
QPushButton
QLabel
QLineEdit

//logindlg.h #ifndef LOGIN_DLG_H #define LOGIN_DLG_H #include <QDialog> #include <QLabel> #include <QLineEdit> #include <QPushButton> class LoginDialog : public QDialog { private: QLabel *lbluser; QLabel *lblpass; QLineEdit *edtuser; QLineEdit *edtpass; QPushButton *btnlogin; QPushButton *btncancel; public: LoginDialog(QWidget *parent=NULL); }; #endif

//logindlg.cpp #include "logindlg.h" LoginDialog::LoginDialog(QWidget *parent) :QDialog(parent) { resize(400,300); move((1024-400)/2,(768-300)/2); lbluser=new QLabel(this); lblpass=new QLabel(this); lbluser->resize(100,30); lbluser->move(50,40); lblpass->resize(100,30); lblpass->move(50,100); lbluser->setText(QObject::tr("用户:")); lblpass->setText(QObject::tr("口令:")); edtuser=new QLineEdit(this); edtpass=new QLineEdit(this); edtuser->resize(200,30); edtuser->move(150,40); edtpass->resize(200,30); edtpass->move(150,100); btnlogin=new QPushButton(this); btncancel=new QPushButton(this); btnlogin->resize(60,30); btnlogin->move(90,210); btncancel->resize(60,30); btncancel->move(250,210); btnlogin->setText(QObject::tr("登录")); btncancel->setText(QObject::tr("取消")); }

//main.cpp #include "logindlg.h" #include <QApplication> #include <QTextCodec> int main(int args,char**argv) { QApplication app(args,argv); QTextCodec *codec =QTextCodec::codecForName("gb2312"); QTextCodec::setCodecForTr(codec); LoginDialog dlg; dlg.resize(400,300); dlg.setVisible(true); return app.exec(); }
4.QT的界面设计器
designer
4.1.工具视图:
用户设计区
工具箱
资源管理器
属性编辑器(ctrl+i)
动作编辑器
信号槽编辑器
对象察看器(选择对象)
4.2.保存文件
*.ui
4.3.编辑属性
1.文本属性
2.对象名属性
3.字体属性
4.4.编辑组件
-> <-方向
shift+
ctrl+
shift+ctrl+
4.5.打开ui文件
ui是xml文本文件
4.6.使用ui文件
自动使用
手工使用
uic编译ui文件
产生:Ui_对象名的类
Ui::对象名的类
类的构造器:没有(缺省构造器)
类的方法:setUpUi(QDialog *);
4.7.使用UI类型
作业:
1.完成计算器的界面
思考:
2.创建线程?不停调用文本组件的setText()修改文本?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?