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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Запустить gawk-bash-скрипт из оконного приложения Qt.  (Прочитано 7391 раз)
Фёдор
Гость
« : Июнь 30, 2006, 00:46 »

Я novice в Qt. Работаю под Линуксом Мандрэйк 10.1
        У меня есть оконное приложение, из которого надо запустить сценарий написанный на смеси gawk-bash и полученную информацию вернуть обратно в моё приложения для обработки и вывода на экран. Как это сделать подскажите помогите?
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #1 : Июнь 30, 2006, 08:47 »

смотри QProccess
помогает запускать другие приложения
Записан
Фёдор
Гость
« Ответ #2 : Июнь 30, 2006, 23:41 »

Спасибо. Смотрю уже:)

добавлено спустя 11 часов 27 минут:

 Ещё вопрос! Функции в qt объявляются также как в С?
в отдельном .h файле? Суть в том что я сделал функцию чтобы каждый раз не писать кучу кода, а вставить её и всё, записал в отдельный necfunctions.h файл тип QStringList func() { ... }.  Написал в заголовке ui.h файла своей формы #include"necfunctions.h"(хе и в треугольных скобках тоже пробовал). Тоже самое в main.cpp сделал. И оно при компиляции мне в итоге говорит что функция моя func() находящаяся в necfunctions.h декларирована дважды, и что до этого она была декларирована в ./necfunctions.h . То есть масло масленное выходит.........чо делать.
Записан
Admin
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1988



Просмотр профиля
« Ответ #3 : Июль 01, 2006, 08:55 »

часто пользуют такую конструкцию

в  начале necfunctions.h

#ifndef _NEC_FUNC_H
#define _NEC_FUNC_H

твой код

#endif //_NEC_FUNC_H
Записан
Фёдор
Гость
« Ответ #4 : Июль 05, 2006, 23:59 »

#ifndef NEC_FUNC_HI
#define NEC_FUNC_HI

#include <qdir.h>
#include <qfile.h>
#include <qstringlist.h>
#include <qstring.h>
#include <qcombobox.h>

QStringList allpostslist()
{
    QString post_ID,post_place,post_status;
    QString configDirPath=QDir::homeDirPath()+"/monitor/config";
    QDir di(configDirPath);
    di.setFilter(QDir::Files | QDir::Hidden | QDir::NoSymLinks);
    di.setSorting(QDir::Name);
    QStringList list_Dir=di.entryList();  /*список всех конфигурационных файлов и в то же время АйДи номеров//строка с АйДи номером пост*/
    //файл которому будет присвоено название поста
    QDir::setCurrent(configDirPath);  /*устанавливается текущий рабочий каталог с конфигурационными файлами*/
    int co1,co2;
    for(co1=0;list_Dir[co1]!=NULL;co1++)
    {
   
   post_ID=list_Dir[co1];
   QFile post_file;
   post_file.setName(post_ID);
   if(post_file.open(IO_ReadOnly))
    {
   QTextStream file_stream(&post_file);
   for(co2=0;co2!=6;co2++)
   {
     post_place=file_stream.readLine();  
     if(co2==1 && post_place=="1")
     {
         post_status=QString::fromLocal8Bit("ВКЛ.");
     } else if(co2==1 && post_place=="0") {post_status=QString::fromLocal8Bit("ВЫКЛ.");}
   }
   list_Dir[co1]=post_ID+" "+post_status+" "+post_place;
   
   
    }
   post_file.close();
    }
    return list_Dir;
}

#endif
Написал я вот такую тему в necfunctions.h.
Сделал #include "necfunctions.h" в main.cpp и в formpostcontrol.h.
Нажимаю make и оно мне говорит.

qmake -o Makefile postcontrol.pro
g++ -c -pipe -Wall -W -O2 -fomit-frame-pointer -pipe -march=i586 -mtune=pentiumpro  -DQT_NO_DEBUG -DQT_SHARED -DQT_THREAD_SUPPORT -I/usr/lib/qt3/mkspecs/default -I. -I/usr/lib/qt3//include -I.ui/ -I. -I.moc/ -o .obj/main.o main.cpp
g++  -o postcontrol .obj/main.o .obj/formPostControl.o .obj/moc_formPostControl.o   -L/usr/lib/qt3//lib -L/usr/X11R6/lib -lqt-mt -lXext -lX11 -lm
.obj/formPostControl.o(.text+0xdfc0): In function `allpostslist()':
: multiple definition of `allpostslist()'
.obj/main.o(.text+0x0): first defined here
collect2: ld returned 1 exit status

При этом если включить этот necfunctions.h только в formpostcontrol.h а в мэйн просто тупо расписать код целиком. Всё работает. Объясните что я написал не так...
Это не критично работа можно сказать сделана и без этого, но просто хочу для себя понять и разобраться. ПРИГОДИТСЯ ведь.
Записан
Deiv
Гость
« Ответ #5 : Июль 06, 2006, 07:47 »

Обычно в ашке прописываются прототипы функций
а вы там прописали тело функции и подключили к двум модулям
косяк
Записан
Фёдор
Гость
« Ответ #6 : Июль 06, 2006, 23:11 »

Прошу прощения если я удивлю вас. Что есть прототип функции?

добавлено спустя 2 минуты:

 Где в таком случае описывается сама функция? В теле программы?
Записан
Deiv
Гость
« Ответ #7 : Июль 07, 2006, 09:23 »

Цитата: "Фёдор"
Прошу прощения если я удивлю вас. Что есть прототип функции?

добавлено спустя 2 минуты:

 Где в таком случае описывается сама функция? В теле программы?


Мда ...
Читать вводные лекции по С или С++ както не испытываю желания
В инете много электронных учебников по этим языкам
Конкретно по вашему вопросу:
http://www.intuit.ru/department/se/pbmsu/9/5.html
Слегка кривовато, но сойдет.
Записан
Фёдор
Гость
« Ответ #8 : Июль 07, 2006, 12:46 »

Cпасибо)
Записан
Фёдор
Гость
« Ответ #9 : Июль 18, 2006, 09:39 »

У меня возникла проблема.
Моё оконное приложение может запускать, внешние файлы на gawk-bash-perl, их работа достаточно долгая. Выход с stderr и stdout идёт в отдельное поле textEdit. Иногда при выключенных приборах, получается так что запустив эту внешнюю программу, совершается долгая холостая работа(это можно видеть по stdout). И я сделал кнопочку, которая должна убивать процесс. Но тут и умер.
QProcess *proc;
Потом в SLOT отдельных связанных с кнопками я делал нечто вроде

formPostControl::text()
{
proc=new QProcess(this);
......//вставлял сюда аргументы и т д делал нужные connect и приложение работало замечательно.
}

//а при переходе к SLOT убивающему процесс
formPostControl::stopProc()
{
if(proc->isRunning())
{
proc->tryTerminate();
QTimer::singleShot( 5000, proc, SLOT( kill() ) );
}
else
{
textEditWorkingMess->setText(QString::fromLocal8Bit("Работающих процессов нет"))
}
}

При компиляции проскакивает нормально. А при нажатии на кнопку в окне(заведомо зная что процесс щас не запущен) происходит вылет и говорится segmentation fault. Всё дело в proc->isRunning(). Что здесь неправильно? Я пробовал просто без if взять tryTerminate() и всё. При запущенном процессе оно его останавливает, а при отсутсвии запущенных процессов, вылетает моё окно.
Записан
Deiv
Гость
« Ответ #10 : Июль 18, 2006, 11:07 »

Скорее всего, до этого момента объект *proc не создан
и в указателе proc записан null или мусор
соответственно прога и ломается
Цитата: "Фёдор"

if(proc->isRunning())

попробуй предварительно проверять существование объекта
if (!proc)
{
//  работа с указателем прос
}
else
{
// прога не запущена
}
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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