posts - 200, comments - 8, trackbacks - 0, articles - 0

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






只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理