DAY5--Qt的时间,定时器,多任务和移植

314 阅读4分钟

Qt的非界面常用类

Qt中时间

       ```c
       时间相关类:
           QDate -------- 年月日
           QTime -------- 时分秒
           QDateTime ---- 年月日时分秒
       ```

获取系统时间

static QTime QTime::currentTime(); 

转换成字符串

成员函数:
    QString QTime::toString(QString &format)const;
    //format表示时间的格式
    //10:56:30   format="hh:mm:ss"==>"10:56:30"

日期类的用法类似。

定时器

QObject类自带定时器

启动定时器

int QObject::startTimer(int interval, Qt::TimerType timerType = Qt::CoarseTimer);
参数:
    interval - 定时器定时时间,单位是毫秒
    timerType - 计时精度,采用默认
返回值:
    返回定时器的ID    

关闭定时器

void QObject::killTimer(int id);
//传入要关闭的定时器ID

定时器超时处理函数

当定时器时间到,自动调用该函数

[virtual protected] void QObject::timerEvent(QTimerEvent *event);
//重写该函数 event->timerId() ----- 获取定时器ID

Qt中的定时器类 ---------- QTimer

构造QTimer对象

启动定时器

//成员函数
void start(int msec);//设置+启动
//msec:超时时间,单位是毫秒

暂停定时器

void stop();

超时信号

signals:
    void timeout();
//定时器时间到自动触发该信号,自动调用其连接的槽函数   

练习:

使用定时器实现一个秒表,秒表10ms刷新一次时间,显示时分秒,秒保留3位小数

Qt中的多任务

Qt中的进程 ---------- QProcess(进程相对独立的进程)

QProcess是一个进程类,QProcess启动进程的方式类似于Linux中的fork+exec

成员函数:

start(命令,参数); ------------ 启动进程执行可执行程序
kill(); ----------- 结束进程
state(); ---------- 获取进程状态
    QProcess::Running ----- 正在运行
    QProcess::NotRuning --- 未在运行
waitForFinished(); -------- 等待进程结束    

Qt中的线程 --------- QThread

win中调用线程

Snipaste_2022-08-19_19-07-44

Qt提供了支持线程的类QThread,也提供了许多类实现线程的互斥和同步:互斥锁(QMutex),读写锁(QReadWriteLock),信号量(QSemaphore),条件变量(QWaitCondition)。

线程的实现语法

class MyThread:public QThread{
    O_OBJECT
    //...
protected:
    void run();//子类重写父类的线程函数
    //...        
};

void MyThread::run()
{
    //线程需要完成的工作
}

线程控制相关的成员函数

1.启动线程
    void start();
2.退出线程
    void exit(ret=0);
3.终止线程
    void terminate();
4.等待线程
    void wait(time=xxx);
5.线程睡眠
    void sleep(s);
    void msleep(ms);
    void usleep(us);

添加一个class文件,自己new的来重写

线程要去重写

image-20220819210512909

会报错,要加上头文件,QTthread

image-20220819210527306

image-20220819210719491

使用线程模拟文件下载

何时使用线程

程序中有多个耗时的操作,通常是前台操作(界面操作)和后台操作都比较耗时,如果只有一个线程,导致界面响应变慢,此时可以使用多线程。

线程的互斥和同步

由于线程之间共享的数据较多,访问共享数据时使用互斥和同步机制加以保护

1)互斥锁 --------- QMutex

加锁:
    void lock();
    bool trylock();
解锁:
    void unlock();    

2)读写锁 --------- QReadWriteLock

加读锁(共享锁):
    void lockForRead();
加写锁(互斥锁):
    void lockForWrite();
解锁:
    void unlock(); 

3)信号量 --------- QSemaphore

P操作(-1):
    void acquire(int r=1);
    
V操作(+1):
    void release(int n=1);

4)条件变量 ------ QWaitCondition

```c
等待:
    bool wait(QMutex &);
唤醒:
    void wakeOne();//唤醒一个
    void wakeAll();//全部唤醒
```

Qt程序的移植

Qt是跨平台的,当Qt程序要运行在嵌入式Linux中,需要进行移植,Qt移植分为两个部分

1.Qt环境的移植(库)//需要动态库的支持
2.Qt程序的移植

Qt环境的移植

Qt是开源的,所以可以从官网下载Qt源代码,使用交叉编译工具编译成目标平台(arm-linux)的库文件,将编译生成的库文件拷贝到开发板,并设置环境变量即可。

移植Qt和移植其他的Linux工具的方法没有区别

GEC6818开发板的Qt环境移植已经完成,Qt相关的文件在/usr/local/Qt-Embedded-5.7.0

Qt程序的移植

这里老师讲的不好可,看我另一篇文章

作业:

1.将将文件下载模拟程序移植到开发板运行(界面大小不要超过开发板屏幕大小800 X 480)

交作业截图即可


关闭开发板默认加载的程序

vi /etc/profile 注释一下内容即可