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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: QProcess + QThread  (Прочитано 3897 раз)
merke
Гость
« : Февраль 15, 2011, 13:23 »

Всем привет.
Есть приложение со следующей структурой.

Гуи + Первый поток + Второй поток

В первом потоке я работаю с сокетами: авторизую клиентов, принимаю от них данные и передаю на обработку Второму потоку.
Второй поток получая команды от Первого потока вызывает микропрограммы, запустив дожидается результата их работы и полученные данные от работы микропрограмм пересылает в Первый поток и этот уже в свою очередь отправляет полученные данные клиентам.

Вот кусок кода во Втором потоке:

Код
C++ (Qt)
void ProcessingThread::processingCmd(QString ident, QByteArray data)
{
   QString buf(data);
   emit toLog("Processing thread receive "  + buf);
 
   QProcess *proc = new QProcess;
 
   connect(proc, SIGNAL(started()), this, SLOT(onProcStarted()));
   connect(proc, SIGNAL(readyReadStandardOutput()), this, SLOT(onProcReadyReadOut()));
   connect(proc, SIGNAL(readyReadStandardError()), this, SLOT(onProcReadyReadErr()));
   connect(proc, SIGNAL(finished(int)), this, SLOT(onProcFinished()));
 
   proc->moveToThread(this);
 
   if (data.contains("EXECUTE"))
   {
       emit toLog("Has EXECUTE");
       QStringList lstArg;
       QString bf;
       bf.append("EXECUTE");
       lstArg.append(bf);
 
       proc->start("./mprg_execute", lstArg);
 
       mapMPRG.insert(ident, proc);
   }
}

Здесь я в параметрах функции получаю имя Клиента и Команду и далее смотря что за команда запускаю микропрограмму. Если закомментить строку 
Код:
proc->moveToThread(this);
, то сигнал started() у QProcess испускается дважды, отсюда следует, что МПРГ запустилась дважды, а если раскоментить 
Код:
proc->moveToThread(this);
, то всё работает прекрасно.

Объясните, пожалуйста, в чем фишка?

Буду очень рад помощи
Записан
merke
Гость
« Ответ #1 : Февраль 16, 2011, 11:02 »

аууу))) Смеющийся
Записан
kdm
Гость
« Ответ #2 : Февраль 16, 2011, 11:15 »

Скинь проект поиграться (всеравно делать нечего).
Можно попробовать указывать родителя = new QProcess(this) вместо movetothread. Но вообще странно.
Записан
merke
Гость
« Ответ #3 : Февраль 16, 2011, 11:24 »

нет, скинуть весь проект не могу Шокированный
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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