首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用QProcess->setReadChannelMode(QProcess::MergedChannels)和QProcess->readall()

使用QProcess->setReadChannelMode(QProcess::MergedChannels)和QProcess->readall()
EN

Stack Overflow用户
提问于 2016-02-16 21:09:05
回答 1查看 371关注 0票数 1

这是我第一次在stackoverflow上提问。我是一个中国女孩,如果我对这个问题的描述有太多的语法错误,让你不容易理解,我很抱歉。下面是我的问题: headerfile:

代码语言:javascript
复制
class AdbDriver : public QObject
{
    Q_OBJECT
private:
    QString PnPutilPath_;
    QProcess *process_;
public:
    explicit AdbDriver(QObject *parent = 0);
    ~AdbDriver();
    void installDriver();
};
AdbDriver::AdbDriver(QObject *parent):QObject(parent){
    PnPutilPath_ = qgetenv("WINDIR") + "\\sysnative\\pnputil.exe";
    process_ = new QProcess();
    process_->setReadChannelMode(QProcess::MergedChannels);
    process_->setStandardOutputFile("E:/log.txt");
}

源文件:

代码语言:javascript
复制
 AdbDriver::~AdbDriver(){
        delete process_;
    }

    void AdbDriver::installDriver(){
        QFile file(PnPutilPath_);
        if(file.exists()){
            qDebug()<<"pnputil.exe exist";    
            QString generaladbDriver = "E:/driver_androidusb/generaladb.inf";
            qDebug()<<"the programming include driver:"<<generaladbDriver;
            QFile file(generaladbDriver);
            if(file.exists()){
                qDebug()<<"yes, the driver is right in bihu package";
            }
            else{
                qDebug()<<"loss driver in bihu package";
            }
            QStringList arguments;
            arguments<<"-i"<<"-a"<<generaladbDriver;
            process_->start(PnPutilPath_, arguments);
            while(!process_->waitForStarted()){
                qDebug()<<"wait";
            }
            qDebug()<<"while out";
            process_->waitForReadyRead();
            qDebug()<<"start";
    //      qDebug()<<process_->readAll();
            process_->close();
        }
        else{
            qDebug()<<"sorry, your computer has no tool pnputil.exe.";
        }
    }

当我注释掉代码时

代码语言:javascript
复制
qDebug()<<process_->readAll();

并使用

代码语言:javascript
复制
 process_->setReadChannelMode(QProcess::MergedChannels);
 process_->setStandardOutputFile("E:/log.txt");

如果我使用properly.But,它就能正常工作

代码语言:javascript
复制
qDebug()<<process_->readAll();

而不是

代码语言:javascript
复制
 process_->setReadChannelMode(QProcess::MergedChannels);
 process_->setStandardOutputFile("E:/log.txt");

这将是错误的。理由是什么呢?

EN

回答 1

Stack Overflow用户

发布于 2016-02-16 21:35:33

根据Qt文档,setReadChannelModesetStandardOutputFile都必须在QProcess::start之前调用才能生效,因此请替换

代码语言:javascript
复制
qDebug() << process_->readAll();

使用

代码语言:javascript
复制
process_->setReadChannelMode(QProcess::MergedChannels);
process_->setStandardOutputFile("E:/log.txt");

与注释掉qDebug() << process_->readAll();是一样的。

所以我猜这个子进程不会输出任何东西,所以process_->readAll()会阻塞,程序会暂停。

(你看一下E:/log.txtprocess_->readAll()你看一下有没有内容,估计是阻塞了)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35433517

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档