回顾:
线程与进程
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();
}
SOURCES = main.cpp
CONFIG = release qt
QT = core gui
TARGET = main
以窗体为基本单位的封装
案例:
登录
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()修改文本?