linux高级编程day13 笔记

回顾:
  线程与进程
  1.进程由于资源独立,进程的主要关注是解决资源共享
  2.线程先天是数据共享,线程主要关注共享数据脏
    1.互斥量(线程内)
       读写锁

    2.信号/条件量调度(线程之间)
     信号量

一.线程的信号量
  1.定义信号量sem_t
  2.初始化信号量sem_init
  3.操作信号量sem_post  sem_wait
  4.释放信号量sem_destroy  
  5.其他函数sem_getvalue
案例:
  创建一个子线程
    子线程-信号量(阻塞)
    主线程+信号量(解除阻塞)
  体会:
    信号量可以累加
    +-操作单位是1

View Code
#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的项目组织

View Code
#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文件
小例子:

View Code
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

View Code
#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文件的编写:

View Code
TEMPLATE=app
SOURCES=main.cpp
CONFIG=release qt
QT=core gui
TARGET=main

  3.代码组织
   以窗体为基本单位的封装
案例:
  登录
   QDialog
   QPushButton
   QLabel
   QLineEdit 

View Code
//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
View Code
//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("取消"));
}
View Code
//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()修改文本?

原文地址:https://www.cnblogs.com/tangzhengyue/p/2619275.html