回顾:
线程与进程
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()修改文本?