回顧:
線程與進程
1.進程由于資源獨立,進程的主要關(guān)注是解決資源共享
2.線程先天是數(shù)據(jù)共享,線程主要關(guān)注共享數(shù)據(jù)臟
1.互斥量(線程內(nèi))
讀寫鎖
2.信號/條件量調(diào)度(線程之間)
信號量
一.線程的信號量
1.定義信號量sem_t
2.初始化信號量sem_init
3.操作信號量sem_post sem_wait
4.釋放信號量sem_destroy
5.其他函數(shù)sem_getvalue
案例:
創(chuàng)建一個子線程
子線程-信號量(阻塞)
主線程+信號量(解除阻塞)
體會:
信號量可以累加
+-操作單位是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次,然后每隔一秒打印一次。
作業(yè):
搖獎程序,繼續(xù)暫停7位隨機數(shù)
信號量/條件量/信號?
目的:選擇哪種技術(shù)實現(xiàn)?
1.無法使用互斥與讀寫鎖實現(xiàn).
2.信號實現(xiàn)不穩(wěn)定.
3.沒有互斥建議不考慮條件量.
4.最佳選擇信號燈.
二.線程的讀寫鎖(自學(xué))
pthread_rwlock_t;
pthread_rwlock_init;
pthread_rwlock_destroy;
pthread_rwlock_rdlock;
pthread_rwlock_wrlock;
pthread_rwlock_unlock;
讀讀兼容
寫寫互斥
讀寫互斥
作用主要是為IO操作設(shè)計.
三.線程私有數(shù)據(jù)(了解)
pthread_key_create
pthread_key_delete
四.QT
1.工具
assistant 幫助文檔
qtconfig QT配置工具
qmake QT的make與項目文件智能創(chuàng)建工具
uic UI界面的設(shè)計文件的編譯工具
moc moc代碼創(chuàng)建工具
designer UI設(shè)計工具
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
//執(zhí)行程序
QApplication app(args,argv); //將main的參數(shù)傳進去
////////////////////////////
//在這里可以隨便創(chuàng)建窗體
QDialog dlg;
dlg.setVisible(true);
////////////////////////////
return app.exec();//等待所有子線程結(jié)束,才能結(jié)束
}
注意:
1.QT是C++程序.
2.QT程序要啟動QT的環(huán)境QApplication
3.編程的模型
qmake -project
qmake *.pro
make
執(zhí)行
4.*.pro文件
TEMPLATE=
:app 應(yīng)用程序
:lib 庫
SOURCES=
:cpp文件1 cpp文件2 cpp文件3 ....
:\ 續(xù)行符號
: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.怎么學(xué)習(xí)QT
QT類的結(jié)構(gòu)層次.
QT的信號signal與槽slot.
QT基本組件
QT的UI設(shè)計器
五.直觀認識QT
封裝與幫助文檔的使用
1.文檔的組成部分:
1.模塊
2.類作用簡單描述
3.頭文件
4.父類與派生類
5.構(gòu)造器/析構(gòu)器()
6.共有函數(shù)
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("確定")); //轉(zhuǎn)碼,防止亂碼
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的界面設(shè)計器
designer
4.1.工具視圖:
用戶設(shè)計區(qū)
工具箱
資源管理器
屬性編輯器(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文件
產(chǎn)生:Ui_對象名的類
Ui::對象名的類
類的構(gòu)造器:沒有(缺省構(gòu)造器)
類的方法:setUpUi(QDialog *);
4.7.使用UI類型
作業(yè):
1.完成計算器的界面
思考:
2.創(chuàng)建線程?不停調(diào)用文本組件的setText()修改文本?