Поиск:

Ответ в темуСоздание новой темы Создание опроса
> QProcess, не поступают сигналы при выполнении 
V
    Опции темы
Jessy
Дата 27.9.2011, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Есть 2 класса. В одном все работает как и должно работать, в другом не работают сигналы qprocess.

1-ый, где все работает:

Файл write_cd.ui.h, созданный creator-ом.

Код

QProcess *proc;

void FWriteCD::scan_cdroms()
{

    proc = new QProcess( this, "proc" );

    connect( proc, SIGNAL( readyReadStdout() ), SLOT( readFromScancdroms() ) );

    system("echo \"sudo lshw | awk '/*-cdrom/,/*-/ && \\$0 !~ /*-cdrom/'\" > console.sh");
    system("chmod u+x console.sh");

    proc->addArgument( "./console.sh" );

    QStringList list = proc->arguments();
    QStringList::Iterator it = list.begin();
    while( it != list.end() ) {
        puts( *it );
        ++it;
    }

    if ( !proc->start() ) {
        puts("readFromScancdroms failed started!");
    }
    

}

void FWriteCD::readFromScancdroms()
{
    QString cdroms, cd, dvd, rw,  name;
    QStringList name_dvd, name_cd, lname;

    int i=0, er, find_cd = 0;

    listBox1->clear();

    for(;;)
    {
        if ((cdroms = proc->readLineStdout()) == NULL)
            break;

        // Обрабатываю строки
    }
}


Его заголовочный файл:

Код

#ifndef FWRITECD_H
#define FWRITECD_H

#include <qvariant.h>
#include <qdialog.h>

class QVBoxLayout;
class QHBoxLayout;
............

class FWriteCD : public QDialog
{
    Q_OBJECT

public:
    FWriteCD( QWidget* parent = 0, const char* name = 0, bool modal = FALSE, WFlags fl = 0 );
    ~FWriteCD();
     .............

public slots:
    virtual void scan_cdroms();
    virtual void readFromScancdroms();
    .............


protected:
    QHBoxLayout* FWriteCDLayout;
    ....

protected slots:
    virtual void languageChange();

};


И 2-ой класс, который я создавал ручками.

Copy_CD.cpp

Код

#include "Copy_CD.h"

Copy_CD::Copy_CD() : QObject()
{

}

QProcess *system_exec;

//===========================================================================
int Copy_CD::Copy_CD_Process_ByCommand( const QStringList &aCmdStr, char *aSegptr )
{
    int StageNum = 1, Res = 0; // it is success
    unsigned i;
    QString CmdStr, ReturnStr = "0";

    system_exec = new QProcess( this, "system_exec" );

    cout << system_exec << endl;

    connect( system_exec, SIGNAL( readyReadStdout() ), SLOT( system_exec_func() ) );

        system("echo \"" + CmdStr + "\" > console.sh");
        system_exec->clearArguments();
        //system_exec->addArgument( "./console.sh" );
        system_exec->addArgument( "cat" );
        system_exec->addArgument( "commandout.txtbus" );

        //system_exec->addArgument( "mkdir" );
        //system_exec->addArgument( "QQQQQQQQQQQQQ" );

    QStringList list = system_exec->arguments();
    QStringList::Iterator it = list.begin();
    while( it != list.end() ) {
        puts( *it );
        ++it;
    }
        if ( !system_exec->start() ) {
            puts("system_exec_func failed started!");
        }



    strcpy( aSegptr, ReturnStr );

    return Res;
}

void Copy_CD::system_exec_func()
{
    QString str;

    puts("system_exec_func started!");

    for(;;)
    {
        if ((str = system_exec->readLineStdout()) == NULL)
            break;
        puts(str);
    }
}
]



Его заголовочный файл:

Код

#include <qobject.h>
#include <stdio.h>

#include <qprocess.h>

#include <stdlib.h>
#include <qobject.h>

#include <iostream>
using namespace std;

#include <signal.h>
#include <qsignal.h>

#ifndef _Copy_CD_h_
#define _Copy_CD_h_

class Copy_CD : public QObject
{
    Q_OBJECT
    public:
        Copy_CD();
        //~Copy_CD();

        int Copy_CD_Process_ByCommand(const QStringList &aCmdStr, char *aSegptr);
    public slots:
        virtual void system_exec_func();
};

#endif




Проблемма в следующем, не генерируются сигналы QProcess( SIGNAL( readyReadStdout() ) ) . system_exec->start() происходит успешно и действие выполняется(проверил созданием папки). Но system_exec_func() не запускается.


Класс создаю так:

Код

        Copy_CD cd;

        Res = cd.Copy_CD_Process_ByCommand( CmdList, Segptr );


Pro файл следующий:

Код

TEMPLATE    = app
LANGUAGE    = C++

CONFIG    += qt warn_on release

HEADERS    += Service/Cmd_reader/CDWriterUtil.h\
    Service/Cmd_reader/Copy_CD.h

SOURCES    += main.cpp \
    Service/Check/CheckReg.cpp \
    Service/Check/Register.cpp \
    Service/Check/vks.cpp \
    Service/Cmd_reader/CDWriterUtil.cpp \
    Service/Cmd_reader/CmdReader.cpp \
    Service/Cmd_reader/Copy_CD.cpp \
    Service/Cmd_reader/TxtUtil.cpp \
    Service/FindExe/FindExeDir.cpp \
    Service/Pbar/ProgressForm.cpp \
    Service/SystemUtils/CheckRunning.cpp \
    Service/SystemUtils/FileDir.cpp \
    Service/SystemUtils/GetUser.cpp \
    protocol.cpp

FORMS    = write_cd.ui

IMAGES    = images/111 \
    images/12345.png \
..........................

unix {
  UI_DIR = .ui
  MOC_DIR = .moc
  OBJECTS_DIR = .obj
}



Создавал в классе свои сигналы, и принудительно их посылал. Все работало правильно.

Если кто увидит мою глупость и поможет исправить
заранее, спасибо.

Это сообщение отредактировал(а) Jessy - 28.9.2011, 11:13
PM MAIL   Вверх
borisbn
Дата 28.9.2011, 08:54 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 48
Всего: 135



Что пишет в окне Output ?
И ещё... Может это и работает
Цитата(Jessy @  27.9.2011,  18:56 Найти цитируемый пост)
if ((str = system_exec->readLineStdout()) == NULL)

но я не понимаю как. QString сравнивается с NULL  smile 


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
Jessy
Дата 28.9.2011, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Цитата

Что пишет в окне Output ?


Идет дальнейшая работа программы, все последующие сообщения. На этот запуск ни чего не пишет.

Цитата

но я не понимаю как. QString сравнивается с NULL  smile 


Так readLineStdout() возвращает QString::NULL, если CanreadLineStdout возвращает false. Ну вот и приводит он типы.

У меня заработало если сделать след.

Код

        if ( !system_exec->start() ) {
            puts("system_exec_func failed started!");
        }


изменить на 

Код

        if ( !system_exec->start() ) {
            puts("system_exec_func failed started!");
        }else{
              system_exec->CanreadLineStdout(); например или любую другую функцию этого класса.
        }


Тогда Сигнал проходит и system_exec_func() стартует.

Это сообщение отредактировал(а) Jessy - 28.9.2011, 12:47
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Кроссплатформенное программирование, QT/Gtk+/wxWidgets"
JackYF
Любитель
  • В заголовке темы в квадратных скобках обозначьте используемую вами библиотеку, например: [QT],[GTK],[wx].
  • Если вопрос актуален только для некоторой версии библиотеки, либо, если вы пользуетесь не самой последней версией, укажите это. Например: [QT4], [GTK2].
  • Все начинающие изучать Qt - не забудьте зайти сюда.
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • В вопросе укажите полную версию версию библиотеки, а также все дополнительные используемые программные пакеты.
  • Не забывайте пользоваться кнопкой "Код".
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к тематике этого раздела. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, Любитель.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | С/С++: Кроссплатформенное программирование, Qt/Gtk+/wxWidgets | Следующая тема »


 




[ Время генерации скрипта: 0.0502 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.