QT-多进程任务处理

2023-10-26

多进程任务处理

在实际项目设计中,往往会遇到这样的情况:多条命令同时执行。这种情况下就需要针对进程进行合理调配,以达到预期效果.

模块设计

定义结构体列表来保存进程信息,结构体信息包含定义的进程、该进程需执行的命令、进程编号3个信息。
定义的进程:执行的进程,用以执行进程命令;
该进程需执行的命令:该命令是以字符串列表的形式定义,代表该进程下有哪些需要命令需要执行;
进程编号:对进程按添加的顺序进行编号,后续进程的执行,状态判断等均以此区分。

该设计的方式为默认的情况下,只存在一个公共进程,在创建对象时创建该端口的执行进程。进程在执行时以扫描进程的命令列表为判断,若命令列表存在未执行的命令,进程将执行该命令,因此通过添加进程的命令即可使该命令执行,执行完毕删除该命令,后续命令前移,因此可实现该进程下多指令的执行。为记录进程执行状态定义一个结构体数组保存数据,可根据进程编号获取其保存的信息。
为方便理解,下面以框图解释:
进程间平行处理,互不影响
在这里插入图片描述

Model_Process.cpp

#include "Model_Process.h"
/**************************************************************************************************************************
 * ***************功能描述:进程处理******************************************************************************************
 * *********************(1)根据USB端口建立进程,进程的执行即是端口执行**********************************************************
 * **********************(2)进程0为全局进程,可用来做全局命令执行,不参与USB升级操作**********************************************
 * ***********************(3)命令执行建立了命令链表,可按链表执行连续操作:命令时间较长时不建议使用**********************************
**************************************************************************************************************************/



/*************************************************************
/函数功能:构造函数:开启定时器,建立全局进程0
/函数参数:无
/函数返回:无
*************************************************************/
Model_Process::Model_Process()
{
    /*设置定时器*/
    m_timerID1=startTimer(10);//刷新进程执行

    /*建立全局进程-进程0*/
    Process_Add();
}

/*************************************************************
/函数功能:析构函数:杀死定时器
/函数参数:无
/函数返回:无
*************************************************************/
Model_Process::~Model_Process()
{
    killTimer(m_timerID1);
}

/*************************************************************
/函数功能:定时器事件:1.扫描执行进程;2.进程定时处理
/函数参数:event:定时器事件
/函数返回:无
*************************************************************/
void Model_Process::timerEvent(QTimerEvent *event)
{
    if(!P_List.length())
        return ;

    if(event->timerId()==m_timerID1)
    {
        /*扫描执行进程*/
        Process_Execute();
    }
}

/*************************************************************
/函数功能:进程添加:根据设备端口添加进程:1~...
/函数参数:无
/函数返回:无
*************************************************************/
void Model_Process::Process_Add()
{
    tProcess_t aProcess;
    aProcess.process=new QProcess();
    aProcess.cmdList.clear();
    aProcess.pNum=P_List.length();
    P_List.append(aProcess);
    //cout<< P_List.length();

    connect(P_List.at(P_List.length()-1).process,SIGNAL(readyRead()),this,SLOT(ProcessReadAll()));
    connect(P_List.at(P_List.length()-1).process,SIGNAL(readyReadStandardError()),this,SLOT(ProcessReadError()));
    connect(P_List.at(P_List.length()-1).process, SIGNAL(stateChanged(QProcess::ProcessState)),this, SLOT(ProcessshowState(QProcess::ProcessState)));

    pParam[aProcess.pNum].isRun=noRun;
    pParam[aProcess.pNum].rTime=0;
    pParam[aProcess.pNum].pBarValue=0;
    pParam[aProcess.pNum].CmdRead="";
    pParam[aProcess.pNum].CmdError="";
}

/*************************************************************
/函数功能:进程添加:根据设备端口添加进程:1~...
/函数参数:Workpath:进程的工作路径
/函数返回:无
*************************************************************/
void Model_Process::Process_Add(QString Workpath)
{
    Process_Add();

    P_List.at(P_List.length()-1).process->setWorkingDirectory(Workpath);
}

/*************************************************************
/函数功能:进程运行目录跳转
/函数参数:无
/函数返回:true:正在运行 false:未运行
*************************************************************/
void Model_Process::ProcessPathJump(QString path)
{
    for(uint8_t i=1;i<P_List.length();i++)
        P_List.at(i).process->setWorkingDirectory(path);
}

/*************************************************************
/函数功能:进程删除
/函数参数:pNum:进程序号
/函数返回:无
/系统进程不可删除
*************************************************************/
void Model_Process::Process_Del(uint8_t pNum)
{
    if((pNum>0)&&(pNum<P_List.length()))
    {
        tProcess_t tempProcess;
        P_List.removeAt(pNum);

        /*删除当前进程后,后面进程的序号修改*/
        for(uint8_t i=pNum;i<P_List.length();i++)
        {
            tempProcess=P_List.at(i);
            tempProcess.pNum=i;
            P_List.replace(i,tempProcess);
        }
    }
    else
        cout << "pNum is Over or SYSProcess.";
}

/*************************************************************
/函数功能:进程执行:遍历进程列表,执行置开始标志,且有进程命令的进程
/函数参数:无
/函数返回:无
//Process.process->waitForFinished();//阻塞,直到上一个进程执行完,再进行下一个进程执行
*************************************************************/
void Model_Process::Process_Execute()
{
    for(uint8_t i=0;i<P_List.length();i++)
    {
        /*进程开启了运行标志且进程命令不为空*/
        if((pParam[i].isRun == RunStart) && (P_List.at(i).cmdList.isEmpty()==false))
        {
            QString cmdStr = P_List.at(i).cmdList.first();

            ProcessOutDeal(i,"EXEC>>"+cmdStr);
            P_List.at(i).process->start("cmd.exe", QStringList() << "/c" << cmdStr);

            /*开启进程失败*/
            if (P_List.at(i).process->waitForStarted()==false)
            {
                cout << i <<"WARN:Failed to start";
                ProcessisOver(i);//进程结束
                pParam[i].isRun=noRun;
            }
        }
    }
}

/*************************************************************
/函数功能:进程开始执行:置进程运行标志位,添加进程执行命令
/函数参数:pNum:进程序号  cmdStr:命令字符串
/函数返回:无
*************************************************************/
void Model_Process::ProcessStart(uint8_t pNum,QString cmdStr)
{
    if(pNum<P_List.length())
    {
        /*若进程未进行,启动运行,否则只添加指令列表*/
        if(pParam[pNum].isRun == noRun)
            pParam[pNum].isRun=RunStart;

        /*进程只执行单个命令,带判断条件;
         * 若执行多个命令,将判断添加去掉,累加即可*/
        if(P_List.at(pNum).cmdList.isEmpty())
        {
            tProcess_t tempProcess=P_List.at(pNum);
            tempProcess.cmdList.append(cmdStr);
            P_List.replace(pNum,tempProcess);
        }
    }
    else
        cout << "pNum is Over.";
}

/*************************************************************
/函数功能:停止进程执行
/函数参数:devNum:进程号  appStr:命令
/函数返回:无
//备注:执行杀死进程的命令
adb -s 8495650c21bb13c shell "ps | grep logcat"
USER     PID   PPID  VSIZE  RSS     WCHAN    PC         NAME
root      2797  1754  2452   1780  c00f7e34 400b6124 S logcat
adb -s 8495650c21bb13c shell kill -9 PID
*************************************************************/
void Model_Process::stopProcess(QString devNum,QString appStr)
{
    //摘自ACCTool工具
    QProcess process;
    QString command;//"adb -s " + devNum +  " shell ps | grep " +appStr;
    if(devNum.isEmpty())
        command = PSGREP(appStr);
    else
        command = PSGREP_S(devNum,appStr);
    cout << (command);
    process.start(command);
    process.waitForStarted();
    process.waitForFinished();
    QByteArray byteArray = process.readAllStandardOutput();
    QString str = QString::fromLocal8Bit(byteArray);
    cout << (str);
    QStringList list = str.simplified().split(" ");
    for (int i=0;i<list.length();i++)
    {
        if(i%9 == 1){
            QString killcmd ;//"adb -s " + devNum + " shell kill -9 " + list.at(i);
            if(devNum.isEmpty())
                killcmd = KILL_9(list.at(i));
            else
                killcmd = KILL_9_S(devNum,list.at(i));
            cout << (killcmd);
            process.start(killcmd);
            process.waitForStarted();
            process.waitForFinished();
            QByteArray byteArray = process.readAllStandardOutput();
            QString str = QString::fromLocal8Bit(byteArray);
            cout << (str);
        }
    }
    process.close();
}

/*************************************************************
/函数功能:进程读信息槽函数
/函数参数:无
/函数返回:无
*************************************************************/
void Model_Process::ProcessReadAll()
{
    if(!P_List.length())
        return ;

    QObject *sender = QObject::sender();

    for(uint8_t i=0;i<P_List.length();i++)
    {
        if(sender==P_List.at(i).process)
        {
            ProcessOutDeal(i,"Out>>"+P_List.at(i).process->readAll());//QString::fromLocal8Bit();//any:最新版本的QT无需转换,可直接输出中文
            break;
        }
    }
}
/*************************************************************
/函数功能:进程读错误信息槽函数
/函数参数:无
/函数返回:无
*************************************************************/
void Model_Process::ProcessReadError()
{
    if(!P_List.length())
        return ;

    QObject *sender = QObject::sender();

    for(uint8_t i=0;i<P_List.length();i++)
    {
        if(sender==P_List.at(i).process)
        {
            ProcessOutDeal(i,"Error>>"+QString::fromLocal8Bit(P_List.at(i).process->readAllStandardError()));
            break;
        }
    }
}

/*************************************************************
/函数功能:进程判断状态槽函数
/函数参数:state:进程状态:Running-正在运行  Starting-开始运行  NotRunning-运行结束
/函数返回:无
*************************************************************/
void Model_Process::ProcessshowState(QProcess::ProcessState state)
{
    if(!P_List.length())
        return ;

    QObject *sender = QObject::sender();

    /*遍历进程*/
    for(uint8_t i=0;i<P_List.length();i++)
    {
        /*确认执行的进程*/
        if(sender == P_List.at(i).process)
        {
            switch(state)
            {
            case QProcess::Running:/*进程正在执行*/
                {
                    pParam[i].isRun=Runing;
                }
                break;
            case QProcess::Starting:/*进程开始执行*/
                {
                    pParam[i].rTime=1;
                    pParam[i].pBarValue=1;
                    ProcessBar(i-1,pParam[i].pBarValue,GREEN);
                }
                break;
            case QProcess::NotRunning:/*进程结束执行*/
                {
                    /*计时清空*/
                    pParam[i].rTime=0;

                    /*删除执行过的命令*/
                    tProcess_t tempProcess=P_List.at(i);
                    tempProcess.cmdList.removeFirst();
                    P_List.replace(i,tempProcess);

                    /*进程执行完毕,仍有命令,继续开启进程执行下一个命令*/
                    if(P_List.at(i).cmdList.isEmpty()==false)
                        pParam[i].isRun=RunStart;
                    else
                    {
                        pParam[i].isRun=noRun;//先转换进程执行状态,再去处理进程结束
                        ProcessisOver(i);//进程结束
                    }
                }
                break;
            }
            break;
        }
    }
}

/*************************************************************
/函数功能:获得某一进程运行状态
/函数参数:pNum:进程序号
/函数返回:sRun_e:进程状态
*************************************************************/
sRun_e Model_Process::GetProcessRunStatus(uint8_t pNum)
{
    return pParam[pNum].isRun;
}

/*************************************************************
/函数功能:是否有进程正在运行
/函数参数:无
/函数返回:true:正在运行 false:未运行
*************************************************************/
bool Model_Process::GetProcessIsRun()
{
    for(uint16_t i=P_List.length();i>0;i--)
    {
        if(pParam[i].isRun != noRun)
        {
            return true;
        }
    }
    return false;
}

Model_process.h

#ifndef MODEL_PROCESS_H
#define MODEL_PROCESS_H

#include <QDebug>
#include <QProcess>
#include <QTimerEvent>
#include <QFileDialog>
#include <QTime>
#include "model_include.h"


#define P_Max 128



/*************************************************************
/运行状态
/noRun:无运行
/RunStart:开始运行
/Runing:正在运行
/RunOver:运行结束
*************************************************************/
typedef enum
{
    noRun,
    RunStart,
    Runing,
    RunOver
}sRun_e;

/*************************************************************
/进程结构体
/process:进程
/pNum:进程序号
/cmdList:命令执行列表
*************************************************************/
typedef struct
{
    QProcess *process;
    uint8_t pNum;
    QStringList cmdList;
}tProcess_t;

/*************************************************************
/进程参数结构体:进程列表参数不可更改,因此建立执行时参数结构体
/CmdRead:读命令执行信息
/CmdError:读命令执行错误信息
/isRun:运行状态
/rTime:运行计时
/pBarValue:运行进度条参数
*************************************************************/
typedef struct
{
    QString CmdRead;
    QString CmdError;
    sRun_e isRun;
    uint32_t rTime;
    uint8_t pBarValue;
}pParam_t;


class Model_Process:public QObject
{
    Q_OBJECT
public:
    Model_Process();
    ~Model_Process();

    //进程处理函数
    void Process_Add();
    void Process_Add(QString Workpath);
    void Process_Del(uint8_t pNum);

    //进程运行处理
    void ProcessStart(uint8_t pNum,QString cmdStr);
    void stopProcess(QString devNum,QString appStr);
    void ProcessPathJump(QString path);
    sRun_e GetProcessRunStatus(uint8_t pNum);
    bool GetProcessIsRun();


private:
    QList<tProcess_t > P_List;//进程列表
    pParam_t pParam[P_Max]; //进程参数

    int m_timerID1;//命令执行

    //内部进程执行
    void Process_Execute();

private slots:
    void ProcessReadAll();
    void ProcessReadError();
    void ProcessshowState(QProcess::ProcessState state);

protected:
    void timerEvent(QTimerEvent *event);

signals:  //信号
    void ProcessisOver(uint8_t pNum);       //进程执行完毕
    void ProcessBar(int Num,int value,QColor color);    //进程进度条
    void ProcessOutDeal(int pNum,QString String);
};




#endif // MODEL_PROCESS_H

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

QT-多进程任务处理 的相关文章

  • Qt Creator 2.8.1 Qt 5.1.1 Qt Designer Linux 显示新窗体

    我是 Qt 的初学者 所以希望这是一个容易回答的问题 我有相当多的 C 经验 这部分不是问题 我的应用程序的目的是进行代码生成 最初是为类制作头文件和实现文件 我非常喜欢 Code Blocks 上的类向导 但我认为我可以做更多的事情 我有
  • QWidget::showMinimized() 不起作用

    在 Ubuntu 13 04 上 如果使用QWidget showMinimized 为了最小化窗口 我发现通过单击系统任务栏上的应用程序图标恢复它后 调用QWidget showMinimized 无法工作 connect minimum
  • 常量类成员、赋值运算符和 QList

    请确认我是否正确并告诉我是否有更好的解决方案 我了解具有常量成员的对象 例如int const width 无法由编译器隐式创建的合成赋值运算符处理 但是 QList 我想 std list 也是如此 需要一个有效的赋值运算符 因此 当我想
  • QWebSocketServer - 不释放内存

    首先 我在安全 websocket 服务器应用程序上运行 valgrind 并发现了一个问题 在 Qt Memcheck 中我必须检查 外部错误 看到它 一些字节是肯定输了 指着我的main就在我的地方QCoreApplication ex
  • 扩展 TabViewStyle styleData

    我目前正在尝试找到一种更好的方法来执行此操作 将图标添加到选项卡 现在 我正在放弃 styleData title 以包含图标源 但如果能够扩展 styleData 就更好了 这样我就可以包含其他自定义属性 这是我当前的黑客 Tab tit
  • wkhtmltopdf 修补了 qt 吗?

    我正在尝试将多个 URL 转换为 PDF 但是 当我编译 wkhtmltopdf 或运行时apt get install wkhtmltopdf并尝试一下 它说 错误 此版本的 wkhtmltopdf 是针对未修补的 QT 版本构建的 并且
  • 包含 Qt 标头的正确方法是什么?

    到目前为止我知道几种方法 includeQt 类 include
  • 如何在 Qt-Creator 中添加自定义构建步骤?

    构建我的应用程序后 我想将其复制到特定目录 在 Windows 7 上 自定义构建步骤 cmd exe c k copy MyPlugin dll HostApp Debug plugins 但我有错误 Can t run process
  • Qt 编译器标志顺序

    我的目标是消除某些类型的编译器警告 我发现可以通过在 pro 文件中添加编译器标志来做到这一点 QMAKE CXXFLAGS Wno unused variable Wno reorder 问题是它们被添加在 Qt 构建系统生成的标志之前
  • QObject多重继承

    我正在尝试在 C Qt 类中使用 mix 来提供一大堆具有通用接口的小部件 该接口是以这样的方式定义的 如果它被定义为其他小部件类的基类 那么小部件本身将具有这些信号 class SignalInterface public QObject
  • QPainterPath::arcTo 上的角度如何解释?

    我正在开发图形编辑器的功能 在其中编辑弧线 当形状是椭圆形时 QPainterPath arcTo 的行为并不像我预期的那样 当它是一个圆圈时 它会按预期工作 下面的两张图片显示了结果 在第一种情况下 我创建了一个圆 然后将其转换为初始起始
  • 从 Qt 更改屏幕分辨率?

    我想更改屏幕分辨率 然后使用一个 ActiveX 控件 Flash 播放器 进入全屏 显然 仅适用于 Windows 的解决方案就可以了 有 Qt api 吗 还是我需要深入研究 winapi 如果是这样 我该在哪里查找 关键字 谢谢您的帮
  • 无法将 [未定义] 分配给 QColor

    我正在使用 Qt 5 11 构建 运行代码 代码中有QML风格如下 Button style delegate Component id enabledButtonStyle ButtonStyle padding top 0 paddin
  • C++ QT libXL 错误:“启动期间程序退出,代码为 0xc0000135”

    我正在尝试编写一个使用 libXL 的 QT 应用程序 但是当我尝试编译时 我收到一个弹出框 显示 During Startup program exited with code 0xc0000135 我已经准确地找出了哪一行导致了问题 它
  • 在另一个中使用 QAbstractListModel

    我在尝试使用 Qt QML 为我的应用程序开发数据模型时遇到问题 我已经用过一个QAbstractListModel能够将海关数据模型从 C 传递到 QML 并且它对于简单模型 例如基于字符串和布尔的模型 来说就像一个魅力 但现在我需要建立
  • PySide6.1 与 matplotlib 3.4 不兼容

    当我只安装PySide6时 GUI程序运行良好 但是一旦我安装了matplotlib及其依赖包 包括pyqt5 则GUI程序将无法运行并输出以下错误消息 This application failed to start because no
  • Qt:关闭期间线程仍在运行时 qthread 被销毁

    我有一堂课 class centralDataPool public QObject Q OBJECT public centralDataPool QObject parent 0 centralDataPool commMonitor
  • 仅当从 Qt 连接时网页返回 HTTP 406 错误

    我有一个测试页面设置http mlecturedownload com test qt php http mlecturedownload com test qt php有以下代码
  • 使用样式表时的 QTabWidget tabPosition

    我目前正在使用样式表来设计应用程序的主题 这是我用于 QTabWidget 的样式表 QTabBar et QTabWidget QTabBar tab background qlineargradient spread pad x1 0
  • 使用信号和槽更新指针

    我对 Qt 很陌生 请帮我解决这个问题 我正在使用线程在后台执行密集操作 同时我想更新 UI 所以我使用 SIGNALS 和 SLOTS 为了更新 UI 我发出一个信号并更新 UI 让我们考虑下面的示例代码 struct sample QS

随机推荐

  • Windows系统安装及初步使用ImageMagick

    最近在网上搜索了很多关于 Windows系统安装及如何使用ImageMagick 的相关文章 都没有详细说明如何使用 经过自己的摸索才明白如何使用 所以今天把它记录下来 1 首先第一步肯定是去官网下载安装包 http www imagema
  • Zotero(2)---使用Sci-hub插件下载文献

    Sci hub插件配置 如果没有安装zotero可以参考https blog csdn net u011895157 article details 126144104 spm 1001 2014 3001 5501 1 首先打开zoter
  • HTML常用的标签

    目录 1 段落 行内 换行标签 2 文本样式标签 3 表格标签 4 表单标签 1 表单域 2 表单控件 5 列表标签 6 超链接标签 7 图像标签 1 段落 行内 换行标签 为了让网页的文字有条理的显示出来 HTML有 p 段落标签 和 s
  • excel中如何将3'30"格式的分秒转换成以秒为单位的数字?

    在excel中 如记录比赛成绩的格式为3 30 要转换成以秒为单位的数字 如210秒的方式 请问该如何操作 假设你的数据在A列 A1 A100 在B1输入下面的公式 然后向下填充 TEXT 00 SUBSTITUTE LEFT A1 LEN
  • C# SuperSocket利用FixedHeaderReceiveFilter或BeginEndMarkReceiveFilter进行通信

    SuperSocket 是一个轻量级 跨平台而且可扩展的 Net Mono Socket 服务器程序框架 你无须了解如何使用 Socket 如何维护 Socket 连接和 Socket 如何工作 我们可以有更多的时间用在业务逻辑上 Supe
  • 大一python作业

    1 字典操作综合练习一 定义一个字典 goods Apple 4999 华为 3600 Vivo 2999 OPPO 3200 三星 4300 向字典新增一个 小米 手机 价格为2800 将字典中 华为 品牌手机价格修改为3999 输入任一
  • 淘宝的双11、春运时的抢票、微博大V的热点新闻,Alibaba双11的高并发实战经验,被这份文档诠释的极透彻

    前言 高并发意味着大流量 需要运用技术手段抵抗流量的冲击 这些手段好比操作流量 能让流量更平稳地被系统所处理 带给用户更好的体验 我们常见的高并发场景有 淘宝的双11 春运时的抢票 微博大V的热点新闻等 除了这些典型事情 每秒几十万请求的秒
  • React中的路由懒加载是什么?原理是什么?

    React lazy 是什么 随着前端应用体积的扩大 资源加载的优化是我们必须要面对的问题 动态代码加载就是其中的一个方案 webpack 提供了符合 ECMAScript 提案 的 import 语法 让我们来实现动态地加载模块 注 re
  • C++模板 类模板成员函数类外实现 类模板分文件编写的问题与解决方法 类模板配合友元函数的类内和类外实现

    文章目录 1 类模板成员函数类外实现 2 类模板分文件编写 3 类模板友元 1 类模板成员函数类外实现 学习目标 能够掌握类模板中的成员函数类外实现 场景描述 创建一个类 类中只写函数的声明 类外写实现 template
  • Git第五讲 git pull/git fetch与 git rebase/git merge

    当你和其他开发者一起协作开发项目时 经常会遇到需要更新代码的情况 Git提供了多种方式来获取最新代码并将其合并到你的本地仓库中 在本篇博客中 我们将详细介绍git pull和git fetch命令的使用 以及git rebase和git m
  • 【目标检测】Faster R-CNN的复现

    文章目录 Faster Rcnn 0 利用Git下载Code 1 数据准备 2 模型加载 3 模型训练 4 模型测试 5 运行demo py 6 训练自定义Images文件和对应XML文件的model Faster Rcnn Faster
  • 1059-前 n 个数字二进制中 1 的个数

    题目如下 给定一个非负整数 n 请计算 0 到 n 之间的每个数字的二进制表示中 1 的个数 并输出一个数组 示例 1 输入 n 2 输出 0 1 1 解释 0 gt 0 1 gt 1 2 gt 10 示例 2 输入 n 5 输出 0 1
  • Windows系统备份

    Windows系统备份 备份种类 全量备份 全量备份就是指对某一个时间点上的所有数据或应用进行一个完全拷贝 实际应用中就是用存储介质 如磁盘或其他方式 对整个系统进行全量备份 包括其中的系统和所有数据 这种备份方式最大的好处就是只要将存储介
  • 优化APK体积

    该篇文章主要来介绍如何减少APK体积 以帮助用户更快地下载App 并加速安装 更新过程 APK内容结构一瞥 要查看APK文件中都包含哪些内容 有两种方式 第一种通过Android Studio的Analyze APK功能查看 该工具不仅可以
  • 微型计算机原理课后题,微型计算机原理-课后习题答案.ppt

    微型计算机原理 课后习题答案 ppt 由会员分享 可在线阅读 更多相关 微型计算机原理 课后习题答案 ppt 30页珍藏版 请在人人文库网上搜索 1 第二章 2 设机器字长为6位 写出下列各数原码 补码和移码 10101 11111 100
  • RT-Thread 访问I/O设备

    访问I O设备 应用程序通过I O设备管理接口来访问硬件设备 当设备驱动实现后 应用程序就可以访问该硬件 查找设备 应用程序根据设备名称获取设备句柄 进而操作设备 获得设备句柄后 应用程序可使用如下函数对设备进行初始化操作 rt err t
  • 百钱百鸡:用100钱买100只鸡,公鸡5钱一只,母鸡三钱一只,小鸡三只一钱,编程输出所有可能的买法(要求每鸡至少买一只)

    include
  • C语言控制语句

    C语言控制语句 一 条件判断语句 1 1 if语句 1 2 switch语句 二 循环执行语句 2 1 while 2 2 for 2 3 do while 一 条件判断语句 条件判断语句也叫选择语句 如果你好好学习 校招时拿一个好offe
  • JPA – Querydsl投影

    在我的上一篇文章中 JPA 基本投影 我已经提到了构建JPA投影的两种基本可能性 这篇文章为您带来了更多示例 这次基于Querydsl框架 注意 这里我指的是Querydsl版本3 1 1 重塑构造函数表达式 看下面的代码 import s
  • QT-多进程任务处理

    QT 多进程任务处理 多进程任务处理 模块设计 Model Process cpp Model process h 多进程任务处理 在实际项目设计中 往往会遇到这样的情况 多条命令同时执行 这种情况下就需要针对进程进行合理调配 以达到预期效