c++ 学习笔记(高级linux编程) day13

来源:互联网 发布:js对象删除某个属性 编辑:程序博客网 时间:2024/06/11 22:57

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()修改文本?

0 0
原创粉丝点击