Russian Qt Forum
Ноябрь 25, 2024, 10:47 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: [SOLVED] Странное поведение переменной при работе с QProcess  (Прочитано 2212 раз)
Az
Гость
« : Апрель 28, 2010, 12:10 »

Столкнулся со странной проблемой, объявленная переменная из одной функции доступна, из другой нет. Чтоб было понятно, что и как, листинг ниже:

mainwindow.cpp
Код
C++ (Qt)
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent)
   : QMainWindow(parent), ui(new Ui::MainWindow)
{
   term_command = new QProcess(this);
   term_command->setProcessChannelMode(QProcess::MergedChannels);
   connect(term_command, SIGNAL(readyReadStandardOutput()), SLOT(command_process()));
   connect(term_command, SIGNAL(finished(int,QProcess::ExitStatus)), this, SLOT(exitProcess()));
   ui->setupUi(this);
   sent();
   save();
}
 
MainWindow::~MainWindow()
{
   delete ui;
}
 
void MainWindow::command_process()
{
  term_command->start(process);
  output = term_command->readAllStandardOutput();
  ui->textEdit->insertPlainText(output); //Output
 
}
void MainWindow::sent()
{
  process="uname";
  command_process();
}
 
void MainWindow::save()
{
  ui->textEdit->insertPlainText(output); //No output
  QFile file("./distrib.txt");
  if (!file.open(QIODevice::WriteOnly | QIODevice::Text))
  return;
  QTextStream out(&file);
  out << output;
}

mainwindow.h
Код
C++ (Qt)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QtGui/QMainWindow>
#include <QProcess>
#include <QFile>
#include <QTextStream>
#include <QByteArray>
 
namespace Ui
{
   class MainWindow;
}
 
class MainWindow : public QMainWindow
{
   Q_OBJECT
 
public:
   MainWindow(QWidget *parent = 0);
   QByteArray output;
   QProcess *term_command;
   QString process;
   ~MainWindow();
 
private:
   Ui::MainWindow *ui;
   void save();
   void sent();
 
private slots:
   void command_process();
 
};
 
#endif // MAINWINDOW_H

mainwindow.ui
Код
C++ (Qt)
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
 <property name="geometry">
  <rect>
   <x>0</x>
   <y>0</y>
   <width>600</width>
   <height>400</height>
  </rect>
 </property>
 <property name="windowTitle">
  <string>MainWindow</string>
 </property>
 <widget class="QWidget" name="centralWidget">
  <widget class="QTextEdit" name="textEdit">
   <property name="geometry">
    <rect>
     <x>30</x>
     <y>20</y>
     <width>251</width>
     <height>181</height>
    </rect>
   </property>
  </widget>
  <widget class="QPushButton" name="pushButton">
   <property name="geometry">
    <rect>
     <x>100</x>
     <y>220</y>
     <width>92</width>
     <height>28</height>
    </rect>
   </property>
   <property name="text">
    <string>PushButton</string>
   </property>
  </widget>
  <widget class="QPushButton" name="pushButton_2">
   <property name="geometry">
    <rect>
     <x>300</x>
     <y>30</y>
     <width>92</width>
     <height>28</height>
    </rect>
   </property>
   <property name="text">
    <string>PushButton</string>
   </property>
  </widget>
 </widget>
 <widget class="QMenuBar" name="menuBar">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>600</width>
    <height>25</height>
   </rect>
  </property>
 </widget>
 <widget class="QToolBar" name="mainToolBar">
  <attribute name="toolBarArea">
   <enum>TopToolBarArea</enum>
  </attribute>
  <attribute name="toolBarBreak">
   <bool>false</bool>
  </attribute>
 </widget>
 <widget class="QStatusBar" name="statusBar"/>
</widget>
<layoutdefault spacing="6" margin="11"/>
<resources/>
<connections/>
</ui>

Как видно из кода, при попытке вывести содержимое output из ф-ции save(), ее содержимое отсуствует, когда как из самой ф-ции command_process оно есть.
В чем тут загвоздка?

Еще странный момент, если изменить строку в ф-ции save() на:
Код
C++ (Qt)
ui->textEdit->insertPlainText(output+"1");
То вывод будет "1Linux". А вот как получается, что это строка вызывается первее, чем раньше вызванная ф-ция я просто не понимаю...
« Последнее редактирование: Апрель 28, 2010, 22:03 от Az » Записан
spectre71
Гость
« Ответ #1 : Апрель 28, 2010, 18:04 »

    sent(); // запустил процесс, и вышел из метода.
// Процесс еще не отработал, данных еще нет
    save(); // Процесс еще не отработал, данных еще нет
// Процесс еще не отработал, данных еще нет
//...
//...
// Данные получили вызвался command_process
// Процесс еще не отработал
//...
// Данные получили вызвался command_process
//...
//...
// Процесс отработал

Вызвай свой save в exitProcess !

Код
C++ (Qt)
void MainWindow::exitProcess ()
{
  save();
}

===========================

И убери term_command->start(process) из command_process
Нафига на чтение данных делать запуск процесса.


Код
C++ (Qt)
void MainWindow::command_process()
{
  output = term_command->readAllStandardOutput();
  ui->textEdit->insertPlainText(output); //Output
}
void MainWindow::sent()
{
  process="uname";
  term_command->start(process);
}
Записан
Az
Гость
« Ответ #2 : Апрель 28, 2010, 22:03 »

Spectre, спасибо тебе, друг! Полдня над этим голову ломал!
Респект!!  Веселый
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.253 секунд. Запросов: 20.