2016-02-16 2 views
1

Это мой первый вопрос, который задает вопрос о stackoverflow. И я китайская девушка, если мое описание об этой проблеме так много грамматической ошибки, что вы не можете понять это легко, мне очень жаль. Ниже мой вопрос: headerfile: с использованием QProcess-> setReadChannelMode (QProcess :: MergedChannels) и с использованием QProcess-> readall()

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"); 
} 

SourceFile:

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."; 
     } 
    } 

когда я закомментирована код

qDebug()<<process_->readAll(); 

и использовать

process_->setReadChannelMode(QProcess::MergedChannels); 
process_->setStandardOutputFile("E:/log.txt"); 

работает properly.But, если я использую

qDebug()<<process_->readAll(); 

вместо

process_->setReadChannelMode(QProcess::MergedChannels); 
process_->setStandardOutputFile("E:/log.txt"); 

это будет неправильно. в чем причина?

+0

что содержание 'E:/log.txt'? Это пусто? – songziming

ответ

1

Согласно Qt документа, как setReadChannelMode и setStandardOutputFile должны вызываться до QProcess::start вступили в силу, поэтому замена

qDebug() << process_->readAll(); 

с

process_->setReadChannelMode(QProcess::MergedChannels); 
process_->setStandardOutputFile("E:/log.txt"); 

такое же, как только закомментировать qDebug() << process_->readAll();.

Так что, я думаю, что дочерний процесс ничего не выводит, поэтому process_->readAll() заблокирует, и программа остановится.

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

+0

Спасибо, но я все еще не могу понять, почему это неправильно при использовании «process _-> readAll()» и комментирования «process _-> setReadChannelMode() process _-> setStandardOutputFile()». – user2919227

+0

И я считаю, что даже если я прокомментирую «процесс _-> readAll()» и использую «process _-> setReadChannelMode()», но не использую «process _-> setStandardOutputFile()», программа по-прежнему ошибается. – user2919227

Смежные вопросы