/*****************************************************************************
* Qt flash_eraseall nandwrite 进度条显示擦除、烧录
* 声明:
* 当我们在 Linux shell中执行nand擦除、烧入程序时,我们可以通过终端查看
* 过程,但是有时候我们可能希望能够有个界面,这样会更直观的提供当前的程序
* 的执行状态,于是个人写了这个Demo,目前暂时使用。
*
* 2015-10-7 雨 深圳 南山平山村 曾剑锋
****************************************************************************/ |\\\\\\\\-*- 目录 -*-///////
| 一、cat main.cpp
| 二、cat mainwindow.h
| 三、cat mainwindow.cpp
| 四、cat thread.h
| 五、cat thread.cpp
\\\\\\\\\\\\\\///////////// 一、cat main.cpp
#include "mainwindow.h"
#include <QApplication> int main(int argc, char *argv[])
{
QApplication a(argc, argv); /**
* 窗口最大化,不允许最小化
*/
MainWindow w;
w.setWindowFlags(w.windowFlags()& ~Qt::WindowMaximizeButtonHint& ~Qt::WindowMinimizeButtonHint);
w.showMaximized();
w.show(); return a.exec();
} 二、cat mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QMainWindow>
#include "thread.h" /**
* shell command:
* nandwrite -p /dev/mtd7 ubi.img
* ......
* Writing data to block 724 at offset 0x5a80000
* Writing data to block 725 at offset 0x5aa0000
* Writing data to block 726 at offset 0x5ac0000
* Writing data to block 727 at offset 0x5ae0000
* Writing data to block 728 at offset 0x5b00000
* Writing data to block 729 at offset 0x5b20000
* Writing data to block 730 at offset 0x5b40000
*
* 这个值要设置得相对大一点比较好,这样就不会出现比100%还大得情况
*/
#define NANDWRITEBLOCKCOUNTS 740 namespace Ui {
class MainWindow;
} class MainWindow : public QMainWindow
{
Q_OBJECT public:
explicit MainWindow(QWidget *parent = );
~MainWindow(); protected:
void moveEvent(QMoveEvent *);
void resizeEvent(QResizeEvent *);
void closeEvent(QCloseEvent *); public slots:
/**
* 与线程对应的三个信号处理函数
*/
void dealNandEraseMesg(QString string);
void dealNandWriteMesg(QString string);
void dealTitleMesg(QString string); private:
Ui::MainWindow *ui;
Thread *thread;
}; #endif // MAINWINDOW_H 三、cat mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QProcess>
#include <QDebug> MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this); /**
* 创建线程来处理nand的擦除、写入,主要是避免在MainWindow的UI线程中处理事务,
* 这样可以避免UI界面不能及时显示改变的数据界面,这在Android的开发中也会
* 遇到这种情况,类似的处理方式。
*/
thread = new Thread();
connect(thread, SIGNAL(nandEraserMesg(QString)), this, SLOT(dealNandEraseMesg(QString)));
connect(thread, SIGNAL(titleMesg(QString)), this, SLOT(dealTitleMesg(QString)));
connect(thread, SIGNAL(nandWriteMesg(QString)), this, SLOT(dealNandWriteMesg(QString)));
thread->start();
} void MainWindow::dealNandEraseMesg(QString string) {
ui->progressBar->setValue(string.toInt());
} void MainWindow::dealNandWriteMesg(QString string) {
int rate = string.toInt()*/NANDWRITEBLOCKCOUNTS;
/**
* 由于最后为了确保显示了100,我传了1000过来这个远大于NANDWRITEBLOCKCOUNTS的值
* 所以这里需要这样操作来避免显示大于100的值
*/
rate = rate >= ? : rate;
ui->progressBar->setValue(rate);
} void MainWindow::dealTitleMesg(QString string) {
ui->title->setText(string);
} MainWindow::~MainWindow()
{
delete ui;
} void MainWindow::moveEvent(QMoveEvent *)
{
/**
* 防止窗口被移动
*/
this->move(QPoint(,));
} void MainWindow::resizeEvent(QResizeEvent *)
{
this->showMaximized();
} void MainWindow::closeEvent(QCloseEvent *)
{
exit();
} 四、cat thread.h
#ifndef THREAD_H
#define THREAD_H #include <QThread>
#include <QProcess>
#include <QDebug> class Thread : public QThread
{
Q_OBJECT
public:
explicit Thread(QObject *parent = ); signals:
/**
* 数据处理过程中,需要用到的三个信号
*/
void titleMesg(QString string);
void nandEraserMesg(QString string);
void nandWriteMesg(QString string); public slots:
void run();
/**
* 判断字符串是不是数字组成的:
* 返回值:
* 0:表示是纯数字组成的;
* 1:表示不是纯数字组成的。
*/
int isDigitStr(QString src);
}; #endif // THREAD_H 五、cat thread.cpp
#include "thread.h"
#include <stdio.h>
#include <unistd.h>
#include <QByteArray>
#include <QStringList> Thread::Thread(QObject *parent) :
QThread(parent)
{
} /**
* 重写的run()方法
*/
void Thread::run()
{
QString readBuffer; /**
* 擦除的时候使用QProcess来处理
*/
QProcess process;
process.start("flash_eraseall /dev/mtd7");
process.waitForFinished(-); // will wait forever until finished /**
* 显示正在做的事
*/
emit titleMesg("erase rootfs...");
while ( !process.atEnd() ) { // 没有到数据末尾
if ( process.canReadLine() ) { // 有数据可读
readBuffer = process.readLine(); // 读取数据 /**
* Erasing 128 Kibyte @ ca40000 -- 81 % complet"
* Erasing 128 Kibyte" e560000 -- 92 % complete
* " asing 128 Kibyte @ e980000 -- 93 % complete
* Erasing 128 Kibyte @ eae0000 -- 94 % comp" te
* Erasing 128 Kibyt" @ f040000 -- 96 % complete
* Erasing 128 Kibyte @ f460000 -- 98 % complete "
*
* 以下代码主要是为了获取上面输出中的百分比数值
*/
// 正则表达式分割数据
QStringList currentLine = readBuffer.split(QRegExp("[\\s]+"));
if ( currentLine.length() > ) { // 我们需要第六个字段
// 第六个字段是否是由纯数字组成
if ( !isDigitStr( currentLine[]) ) {
// 将数据发送给UI线程去处理
emit nandEraserMesg(currentLine[]);
//qDebug() << readBuffer;
}
}
}
}
emit nandEraserMesg(QString()); // 擦除数据完毕 /**
* 1. shell命令行下执行 nandwrite -p /dev/mtd7 ubi.img 的输出:
* Writing data to block 47 at offset 0x5e0000
* Writing data to block 48 at offset 0x600000
* Writing data to block 49 at offset 0x620000
* Writing data to block 50 at offset 0x640000
* Writing data to block 51 at offset 0x660000
* 2. 在编码测试过程中发现使用QProcess无法获取到nandwrite执行过程中的数据,
* 仅仅在处理完毕的时候才会收到数据,所以处理效果不好;
* 3. 所以改用popen来做这件事,但是popen也仅仅是比QProcess好那么一点,每次
* 都是以12%的梯度增长,虽然还是没有像shell中运行的效果,但目前勉强还
* 是能用,所以这里也就暂时这么做;
* 4. 目前没找到更好的办法在解决这个事情。
*/
char buff[];
FILE *fp = popen("nandwrite -p /dev/mtd7 ubi.img", "r"); int count = ;
emit titleMesg("update rootfs...");
while (!feof(fp)) {
fgets(buff, , fp );
emit nandWriteMesg(QString::number(count++));
}
pclose(fp);
// 这里仅仅是为了保证processor bar一定显示100%才这么做的,没其他的意思
emit nandWriteMesg(""); // 显示更新完毕
emit titleMesg("rootfs update over.");
} int Thread::isDigitStr(QString src)
{
//QString 转换为 char*
QByteArray ba = src.toLatin1();
const char *s = ba.data(); /**
* 字符的二进制值是否在'0'、'9'之间
*/
while(*s && *s>='' && *s<='') s++; if (*s) { //不是纯数字
return -;
} else { //纯数字
return ;
}
}

Qt flash_eraseall nandwrite 进度条显示擦除、烧录的更多相关文章

  1. Qt第三方圆形进度条-及其改进

    Qt第三方圆形进度条的改进 要实现一个圆形的进度条功能,在网上找到一个比较出名的第三方封装类:QRoundProgressBar,地址:sourceforge 的 QRoundProgressBar  ...

  2. 【Winform】使用BackgroundWorker控制进度条显示进度

    许多开发者看见一些软件有进度条显示进度,自己想弄,项目建好后发现并没有自己想象中的那么简单...看了网上很多教程后,写了一个小Demo供网友们参考~~,Demo的网址:http://pan.baidu ...

  3. Extjs 使用fileupload插件上传文件 带进度条显示

    一.首先我们看看官方给出的插件的解释: 一个文件上传表单项具有自定义的样式,并且可以控制按钮的文本和 像文本表单的空文本类似的其他特性. 它使用一个隐藏的文件输入元素,并在用户选择文件后 在form提 ...

  4. Ajax上传文件进度条显示

    要实现进度条的显示,就要知道两个参数,上传的大小和总文件的大小 html5提供了一个上传过程事件,在上传过程中不断触发,然后用已上传的大 小/总大小,计算上传的百分比,然后用这个百分比控制div框的显 ...

  5. 【Android】读取sdcard卡上的全部图片而且显示,读取的过程有进度条显示

    尽管以下的app还没有做到快图浏览.ES文件浏览器的水平,遇到大sdcard还是会存在读取过久.内存溢出等问题,可是基本思想是这种. 例如以下图.在sdcard卡上有4张图片, 打开app,则会吧sd ...

  6. MFC读写.txt文件时进度条显示实时进度

    整体实现方式:先获得文件长度,然后用每次读取的长度,计算出完成的百分比,用百分比的值设置进度条. 一.MFC进度条 Progress Control 相关函数 1. create() --创建Prog ...

  7. iOS 获取内存大小使用情况(进度条显示)

    一.获取设备内存大小方法 //返回存储内存占用比例 - (NSString *)getFreeDiskspaceRate{ float totalSpace; .f; NSError *error = ...

  8. ajaxSubmit() 上传文件和进度条显示

    1.  首先引用js文件 <script type="text/javascript" src="/js/jquery/jquery.form.js"&g ...

  9. Python 计算π及进度条显示

    一,首先打开命令提示符找到Python路径,输入pip install tqdm下载第三方库tpdm. 二,写程序 法一 from math import * from tqdm import tqd ...

随机推荐

  1. OpenResty--mysql,redis 项目中的应用

    最近刚刚接手同事的OpenResty的项目,发现对mysql,redis的操作没有用连接池,故对此进行了改造. MYSQL 主要是通过mysql_pool.lua 和 dbutil.lua 来封装对数 ...

  2. html编码常见的有utf-8和gb2312编码等,应该如何判断选择?

    html如何选择编码,常见utf-8和gb2312编码如何判断选择 一.首先了解目前国内中文网页常用编码是utf-8 还是gb2313. 比如: 百度搜索 网页使用utf-8 腾讯新闻 网页使用utf ...

  3. mysql数据库权限

    use mysql select * from user \G; UPDATE user set password=PASSWORD('root') where user='root' grant a ...

  4. sql server 将时间中的时分秒改为00:00:00

    select convert(varchar(10),getdate(),120

  5. 利用python统计代码行

    参加光荣之路测试开发班已三月有余,吴总上课也总问“ 咱们的课上了这么多次了大家实践了多少行代码了?”.这里是一个一脸懵逼的表情.该怎么统计呢?一个个文件数当然不可取,能用代码解决的事咱们坚决不动手.最 ...

  6. bzoj1009 / P3193 [HNOI2008]GT考试

    P3193 [HNOI2008]GT考试 设$f[i][j]$表示主串匹配到第$i$个位置,不吉利数字匹配到第$j$个位置 $g[i][j]$表示加上某数字使子串原来最多能匹配到第$i$个数字,现在只 ...

  7. 20145311 《Java程序设计》第5周学习总结

    20145311 <Java程序设计>第5周学习总结 教材学习内容总结 第八章 8.1语法与继承结构 8.1.1Try.catch java中所有的错误都会打包为对象,可以try catc ...

  8. TCGA三个在线可视化网站

    1.>c-Bioportal: www.cbioportal.org 整合和简化了包括TCGA,ICGC以及GEO等多个癌症基因组数据库的内容,提供友好可视化的界面,可供下载. 主要展示基因的s ...

  9. 使用 if 语句

    与很多编程语言一样,if 表达式用来处理逻辑条件.在 R 中,逻辑条件通常表达为某个表达式返回的单值逻辑向量.例如,我们可以写一个简单的函数 check_positive,如果输入一个正数则返回 1, ...

  10. java中字面量,常量和变量之间的区别(附:Integer缓存机制)

    一.引子 在各种教科书和博客中这三者经常被引用,今天复习到内存区域,想起常量池中就是存着字面量和符号引用,其实这三者并不是只在java中才有,各个语言中都有类似的定义,所以做一下总结,以示区分. 二. ...