让每一步都跳出,这样不破坏整体流程,可以对结果随心所欲的控制(线程中断也可采用这种方法)

中间彻底中断整个流程的话,就不知道整体到底怎么回事了。而且会造成资源泄漏、程序员得不到预定的结果(哪怕是失败的结果,也要按照程序员的格式来记录)。

此外,内部原子操作不必记录错误(否则对同一个文件错误,会有太多的记录,反而也没法再细究了),记录外部的逻辑结果错误即可。

这样,还可以一次性返回 return success1 && success2 && success3 是个好方法,不中断整体流程:

QString MyTool::ZipAES(QString strSrcFile, QString passwd, int bCompress)
{
    bool res = ZipAES(szDestFile, szSrcFile, szPasswd, bCompress, szNewFile);
    if (!res) {
        InsertToolLog("debug", m_taskname, "compress", strSrcFile+" "+tr("cannot be compressed"));
        // return "";
    }

    QString strNewFile = QString::fromLocal8Bit(szDestFile); // codage

    return strNewFile; // 返回的是全路径
}

bool MyTool::ZipAES(char* szDestFile, char* szSrcFile, char* passwd, int bCompress, char* szNewFileName)
{
    // ------------------------------- 准备工作 -------------------------------
    QString file_full=QString::fromLocal8Bit(szSrcFile); // codage error

    const QFileInfo fi = QFileInfo(file_full);
    if (!fi.exists()) {
        InsertToolLog("debug", m_taskname, "compress", QString(file_full)+" file doesnot exist ");
        return false;
    }
    QDateTime last = fi.lastModified();
    QString strTime = last.toString("yyyyMMddhhmmss");
    if (strTime.isEmpty()) {
        InsertToolLog("debug", m_taskname, "compress", QString(file_full)+" time is null ");
        return false;
    }

    QString strFileName = "DATET"+strTime+"-"+fi.fileName()+".zip";
    QString strFinal = m_strTempFolder+"/"+strFileName;

    QByteArray ba = strFinal.toLocal8Bit();
    char* tempPath=ba.data();
    strcpy(szDestFile, tempPath);
    ba = strFileName.toLocal8Bit();
    tempPath=ba.data();
    strcpy(szNewFileName, tempPath);

    // ------------------------------- 流程控制 -------------------------------
    // hang exp 开始压缩后,三个动作是一气呵成的,不必单独判断三次,只要看整体结果即可。压缩过程中,则有回调函数帮忙
    m_thread->UpdateStop("try to zip "+QString::fromLocal8Bit(szSrcFile)); if (m_ignore) return false;

    // ------------------------------- 正式压缩 -------------------------------
    // m_zip->put_Utf8 // codage
    bool success1 = m_zip->NewZip(szDestFile);
    if (success1 != true) {
        qDebug() << QString(m_zip->lastErrorText());
        InsertToolLog("debug", m_taskname, "compress", QString(szDestFile)+" NewZip fails");
        //return false;
    }

    bool success2 = m_zip->AppendOneFileOrDir(szSrcFile, false);
    if (success2 != true) {
        qDebug() << QString(m_zip->lastErrorText());
        // hang exp 外边包装函数也记录结果,那么这里就不用再记录了,虽然不是具体到每一步,不过也已经很清楚了。就算知道是哪个函数,也没用,没法再分割了
        //return false; // 这里就更不必返回了
    }

    bool success3 = m_zip->WriteZipAndClose();
    if (success3 != true) {
        qDebug() << QString(m_zip->lastErrorText());
    }

    return success1 && success2 && success1; // Archi exp 这个方法好,既不会中断前面的各个步骤,也可联合报告结果,供外部使用结果
}

另外,线程的中断也可采用这个方法,让每一个子步骤不断跳出。因为QT里不让直接中断线程,采取这种方法也没有问题。

时间: 2024-08-05 10:51:00

让每一步都跳出,这样不破坏整体流程,可以对结果随心所欲的控制(线程中断也可采用这种方法)的相关文章

马化腾:每一步都做到极致

40年来,中国经历了从计划经济到市场经济的伟大变革.在这被称为"第二次革命"的惊险一跃中,企业家发挥着无可替代的作用.他们是改革开放的受益者,也是中国建立社会主义市场经济的见证者和实践者.他们作为一个群体在市场经济的大潮中崛起,在中国政经和社会生活中发挥着越来越重要的作用. 企业是市场经济能够确立的基石和主体,企业家则成就了企业.纪念改革开放40周年之际,这些站在时代潮头的企业家们,为我们的读者铺开过去40年波澜壮阔的时代画卷. 铭记历史,是为了更好地走向未来.我们希望这个系列访谈成为

二、给定一个 n 行 m 列的地牢,其中 &#39;.&#39; 表示可以通行的位置,&#39;X&#39; 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上。地牢的出口可能在任意某个可以通行的位置上。牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢。

给定一个 n 行 m 列的地牢,其中 '.' 表示可以通行的位置,'X' 表示不可通行的障碍,牛牛从 (x0 , y0 ) 位置出发,遍历这个地牢,和一般的游戏所不同的是,他每一步只能按照一些指定的步长遍历地牢,要求每一步都不可以超过地牢的边界,也不能到达障碍上.地牢的出口可能在任意某个可以通行的位置上.牛牛想知道最坏情况下,他需要多少步才可以离开这个地牢. 个输入包含 1 个测试用例.每个测试用例的第一行包含两个整数 n 和 m(1 <= n, m <= 50),表示地牢的长和宽.接下来的

软件项目开发环境构建之一:整体流程

通常情况下,一个大的项目,很难一个人完成,需要一个团队共同协作,大家彼此分工,共同完成不同或相同的模块,这时要求所使用的工具软件要具有分布式协同功能.处理冲突及持续交付功能,一般软件项目的整体流程如下: 一个软件项目的实施,要经过概念阶段.计划阶段.创建阶段.发布阶段及追踪阶段,Atlassion的软件族都有各阶段的对应软件. 一般,概念阶段,可以使用Confluence 进行需求管理,从最初的想法到最终的需求,能够通过Confluence强大的协同功能,高效的完成需求收集.整理.分类等工作(M

使用git整体流程

一.git提交代码走meger请求的整体流程 工作中使用git推代码时,如果走merge请求,那么也就是说拉代码时拉公共代码库的代码,但是提交时需要先提交到自己的代码库,然后在gitlab上提交merge请求,相应负责人review代码后合并代码到公共代码库中. 之前前面的部分没有总结,过一段时间后竟忘记了什么原理,现在再次使用git总结下一个新员工使用git走meger请求的全流程. 1.gitlab上新建个人远程库 2.在本地建立工作空间文件夹 3.从公共远程库clone对应分支的项目代码到

(转)linux内存源码分析 - 内存回收(整体流程)

http://www.cnblogs.com/tolimit/p/5435068.html------------linux内存源码分析 - 内存回收(整体流程) 概述 当linux系统内存压力就大时,就会对系统的每个压力大的zone进程内存回收,内存回收主要是针对匿名页和文件页进行的.对于匿名页,内存回收过程中会筛选出一些不经常使用的匿名页,将它们写入到swap分区中,然后作为空闲页框释放到伙伴系统.而对于文件页,内存回收过程中也会筛选出一些不经常使用的文件页,如果此文件页中保存的内容与磁盘中

linux input输入子系统分析《四》:input子系统整体流程全面分析

1      input输入子系统整体流程 本节分析input子系统在内核中的实现,包括输入子系统(Input Core),事件处理层(Event Handler)和设备驱动层.由于上节代码讲解了设备驱动层的写法,因此在开头部分会从设备驱动层做为线索,分析输入子系统和事件处理层是如何配合的,最后从用户角度出发,从"/dev/input/*"接口如何使用输入子系统提供的服务. 既然需要详细分析,有一个这样的流程图能够帮助我们在被绕进代码的过程中,找到出口,你能够知道你现在位于代码框架的什

iOS开发从申请开发账号到APP上架的整体流程详解

应公司要求,写一份文档从申请账号一直到APP上架的整体流程,下面进入正文. https://blog.csdn.net/qq_35612929/article/details/78754470 首先第一步,申请开发者账号:开发者账号有三种,分别是个人,组织,教育机构,其中组织又分为公司和企业,其中个人和公司都是99美金/年,企业级的开发者账号为299美金/年,本文详解个人.公司级开发者账号. 准备工作:1. 一张开通visa或master功能的信用卡,公司邮箱,公司网站(需与邮箱后缀一致)2.

笔记-Ajax[1]-的整体流程。

Ajax:异步的javascript and xml;(本文内容有部分是来自于js教程网) Ajax的功能:AJAX 可以与服务器交换数据,在不重新加载(刷新)整个页面的情况下,更新部分页面. Ajax的使用场景如: -用户注册时,输入完用户名立即提交到后台验证,检测用户名是否存. -静态页面实现登录功能. -瀑布流的实现. AJAX XMLHttpRequest对象: XMLHttpRequest 对象用于在后台与服务器交换数据,能够在不重新加载整个网页(刷新)的情况下,对网页进行部分更新.

Android7.0 Vold 进程工作机制分析之整体流程

Android7.0 Vold 进程工作机制分析之整体流程 一.Vold简介 Vold是Volume Daemon的缩写,负责管理和控制Android平台外部存储设备,包括SD插拨.挂载.卸载.格式化等.它是通过init进程解析init.rc脚本所启动的进程.它处于Native层. 二.基础架构 这里引用Gityuan博客的一张图. SystermServer进程和Vold进程是通过Socket进行通信的,Vold进程和Kernel是通过Netlink 进行通信的,Netlink 是一种特殊的S