Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: merke от Февраль 15, 2011, 13:23



Название: QProcess + QThread
Отправлено: 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);
, то всё работает прекрасно.

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

Буду очень рад помощи


Название: Re: QProcess + QThread
Отправлено: merke от Февраль 16, 2011, 11:02
аууу))) ;D


Название: Re: QProcess + QThread
Отправлено: kdm от Февраль 16, 2011, 11:15
Скинь проект поиграться (всеравно делать нечего).
Можно попробовать указывать родителя = new QProcess(this) вместо movetothread. Но вообще странно.


Название: Re: QProcess + QThread
Отправлено: merke от Февраль 16, 2011, 11:24
нет, скинуть весь проект не могу :o