/*****************************************************************************
* 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. 【转】Deep Learning(深度学习)学习笔记整理系列之(六)

    9.3.Restricted Boltzmann Machine (RBM)限制波尔兹曼机 假设有一个二部图,每一层的节点之间没有链接,一层是可视层,即输入数据层(v),一层是隐藏层(h),如果假设所 ...

  2. 142. Linked List Cycle II(找出链表相交的节点)

    Given a linked list, return the node where the cycle begins. If there is no cycle, return null. Note ...

  3. 钉钉企业的CorpId 查看

    打开钉钉开发者文档官网,注册一个账号(个人也可以注册),登陆账号之后在开发账号管理那里可以看到corpid(企业ID),corpsecret需要生成

  4. C#反射——模仿BeanUtil属性复制

    反射工具类请参见:https://www.cnblogs.com/threadj/p/10535796.html using System; using System.Collections.Gene ...

  5. java第七天

    p38~p41: 1.可以通过import 一个自定义类库(或者网上下的)在java中使用c风格的输入输出方式. 2.忘记优先顺序时应该用括号明确规定计算顺序. 3.java的操作符不同于c++,几乎 ...

  6. java第六天

    p37 1.java ant详解 练习8 /** * Created by xkfx on 2017/2/26. */ class A { static int i = 47; } public cl ...

  7. 关于spring框架工作原理的初解

    一:spring基本概念 1)struts2是web框架,hibernate是orm框架 2)spring是容器框架,创建bean,维护bean之间的关系 3)spring可以管理web层,持久层,业 ...

  8. IPv4数据报格式

    网络层的分组为数据报,数据报为首部和数据两部分组成,如下图所示. 首部的长度是以4个字节为单位,长度可以是20-60字节,这跟首部的HLEN字段有关. 版本: 这个4位字段定义了IP协议的版本,目前主 ...

  9. 简单实现Ubuntu16.04 + caffe2 + CUDA9.0 + cuDNN8.0

    在Ubuntu16.04 CUDA9.0 cuDNN8.0的环境下安装caffe2 本博客比较简单,cuda9.0 cudnn8.0部分请看上一篇博客,其中详细讲了: 如何安装驱动 安装cuda 安装 ...

  10. 上海仪电Azure Stack技术深入浅出系列2:Azure Stack与Azure的有QoS保证的网络联通实现方法和对比测试

    本篇文章作为<Azure Stack技术深入浅出系列>的第二篇,将描述我们目前在构建基于Azure Stack混合云业务解决方案方面所面临的网络连通困难,以及相关技术人员为解决这一问题所做 ...