Russian Qt Forum
Июнь 16, 2024, 05:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [РЕШЕНО] QThread и синхронный вызов QProcess в shell.  (Прочитано 2697 раз)
mapron
Гость
« : Ноябрь 13, 2010, 14:30 »

Структура приложения такая:
имеется основной поток, который является веб-сервером и обрабатывает заявки от пользователей на компиляцию, сохраняя в БД.
Имеется CompilerThread, наследуемый от QThread, запускаемый при старте веб-сервера (соединяется с БД другим соединением, здесь нет проблем).
Затем QThread в цикле с задержкой извлекает нужные задачи и выполняет их на компиляцию, вызывая shell-скрипт.
Если этот скрипт запускается из основного потока, то все нормально ,программа компилируется.
Из вторичного потока g++ выдает ошибку "undefined reference to `main\'"

файл build_cpp.sh:
#!/bin/sh
path='/home/mapron/qt/server';
g++ $path/tmp/in.cpp -Wfatal-errors -o $path/tmp/out.run 2>&1

фрагмен run(), цикл опущен:
Код
C++ (Qt)
if (!subm.empty()){
       QFile file("tmp/in.cpp");
       int status=1;
       QString message="Internal error";
       if (file.open(QIODevice::WriteOnly | QIODevice::Truncate)){
           if (QFile::exists(appdir+"/tmp/out.run")){
               QFile::remove(appdir+"/tmp/out.run");
           }
           file.write(subm["txt"].toByteArray());
           file.close(); // ВОТ ЭТА СТРОЧКА ВСЕ РЕШИЛА
           QProcess compiler;
 
           compiler.start("bash",
                          QStringList() << appdir+"/tmp/build_cpp.sh",
                          QIODevice::ReadOnly);
           if (compiler.waitForStarted()){
 
               if (compiler.waitForFinished()){
                   QByteArray result = compiler.readAll();
                   if (result.trimmed()=="" && QFile::exists(appdir+"/tmp/out.run")){
                       status=10;
                       message="";
                   }else{
                       status=2;                      
                       message=result.replace(appdir+"/tmp/","");
                       if (message.indexOf("undefined reference to `main\'")!= -1){
                           message="undefined reference to `main`";
                       }
 
                   }
               }
           }
 
       }
       submiss.update(Var("status",status,"message",message),Var("id=?",subm["id"]));
   }
 
если сделать вывод не bash, а env - то там с путями все в порядке. Если убрать файл физически, то в выводе g++ ругается на отстутсвующий файл. Если в файл написать любой мусор, что угодно - вылазит это сообщение.

UPD: нужно доавить file.close(); после окончания записи Подмигивающий А еще программист с 7 лет опыта называется
« Последнее редактирование: Ноябрь 14, 2010, 15:57 от mapron » Записан
mapron
Гость
« Ответ #1 : Ноябрь 13, 2010, 15:41 »

Что интересно, что если заметить QThread на QTimer, то получается тот же самый результат. Однако если запускать тот же код в основном потоке, то все работает без ошибок, но идеологически это мне кажется не верным. Что я упускаю из виду?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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