/*****************************************************************************
* 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. mysql数据库访问权限限制设置

    ---只能本地访问,设置随意访问 update user set host='%' where host='localhost': flush privileges; ---随意访问,设置只能本地访问 ...

  2. wcf 远程服务器返回了意外响应: (413) Request Entity Too Large。

    我遇到这个问题的原因是:我使用asp.net 网站调用wcf服务后,通过方法提交数据产生的.我提交的数据是一个实体,包含很多字符串和图片格式的二进制数据超过4M 就报个错误. 后来同事帮忙解决了.他说 ...

  3. Java Int和Integer有什么区别?

    Int int是我们常说的整型数字,是Java的8个原始数据类型(Primitive Type:boolean.byte.short.char.int.float.double.long)之一.Jav ...

  4. pug 在线文档

    https://pugjs.org/zh-cn/api/getting-started.html

  5. word 杂记

    45.error和exception有什么区别? 答案:Error表示系统级的错误和程序不必处理的异常,我们无法处理它. Exception表示是可以捕捉或者需要程序进行处理的异常. 47.abstr ...

  6. Http请求中Content-Type

    1.  Content-Type MediaType,即是Internet Media Type,互联网媒体类型:也叫做MIME类型,在Http协议消息头中,使用Content-Type来表示具体请求 ...

  7. Android实践项目汇报

    Android实践项目:推箱子 推箱子是一款来自日本的古老游戏,其设计目的是训练人的逻辑思维能力.游戏场景一般是设定在空间狭小的仓库中,要求把箱子摆放到指定位置.这就要求玩家巧妙的运用有限的空间和通道 ...

  8. Kali2018.1

    目录 制作U盘启动盘 安装 Kali Linux 之后的事 更新源 配置 Zsh 配置 Vim 修改 Firefox 语言为中文 安装 Gnome 扩展 美化 安装 Google 拼音输入法 安装常用 ...

  9. POJ 1170 Shopping Offers(完全背包+哈希)

    http://poj.org/problem?id=1170 题意:有n种花的数量和价格,以及m种套餐买法(套餐会便宜些),问最少要花多少钱. 思路:题目是完全背包,但这道题目不好处理的是套餐的状态, ...

  10. BZOJ 1566 【NOI2009】 管道取珠

    题目链接:管道取珠 这道题思路还是很巧妙的. 一开始我看着那个平方不知所措……看了题解后发现,这种问题有一类巧妙的转化.我们可以看成两个人来玩这个游戏,那么答案就是第二个人的每个方案在第一个人的所有方 ...