Название: Запуск процесса в отдельном треде (Linux only) Отправлено: pashazz от Июнь 08, 2010, 12:00 Ситуация такая.... я разрабатываю программу winegame (http://winegame-project.ru) и столкнулся с проблемой.
Мне нужно запустить процесс wine так, чтобы GUI не фризился на это время. Это можно сделать с помощью QProcess::startDetached. НО! мне нужно отследить, когда процесс завершится. Со startDetached это невозможно, поэтому сейчас используется start. А с ним GUI фризится. Я пытался сделать это на QtConcurrent... примерно так... Код
В итоге получалось так: 1) в консоль сыпалось: cannot create children (0000) for parent (00000) that is in different thread много раз 2)процесс запускался, но в текущем треде 3)после завершения процесса вылезал QProgressDialog, который нужно было отменить.... Как сделать правильно? - вот в чем вопрос. Название: Re: Запуск процесса в отдельном треде (Linux only) Отправлено: Eol от Июнь 08, 2010, 14:38 ... А если воспользоваться startDetached, а для того, чтобы узнать, когда процесс завершился - воспользоваться стандартными сигналами QProcess'а? Конкретней: finished ( int exitCode, QProcess::ExitStatus exitStatus ), stateChanged ( QProcess::ProcessState newState ) или error ( QProcess::ProcessError error ).НО! мне нужно отследить, когда процесс завершится. Со startDetached это невозможно, поэтому сейчас используется start. А с ним GUI фризится. ... (взял с http://doc.trolltech.com/4.6/qprocess.html секция - signals) Название: Re: Запуск процесса в отдельном треде (Linux only) Отправлено: Alex Custov от Июнь 08, 2010, 17:07 Я запускаю процесс через
bool QProcess::startDetached ( const QString & program, const QStringList & arguments, const QString & workingDirectory, qint64 * pid = 0 ) [static] И сохраняю его pid. Потом по таймеру раз в полсекунды проверяю существование процесса с пидом pid. Название: Re: Запуск процесса в отдельном треде (Linux only) Отправлено: Alex Custov от Июнь 08, 2010, 17:10 А если воспользоваться startDetached, а для того, чтобы узнать, когда процесс завершился - воспользоваться стандартными сигналами QProcess'а? startDetached() - статический метод Название: Re: Запуск процесса в отдельном треде (Linux only) Отправлено: Eol от Июнь 08, 2010, 21:51 startDetached() - статический метод Согласен, натупил, прошу прощения.Касательно топика: я воспроизвел простенький проект с GUI, при нажатии на кнопочку он запускает процесс /usr/bin/sleep 5, и подключает его сигнал - finished(...) к своему слоту, по которому он на GUI выводит что-то вроде Finished. Так вот, между Started и Finished у меня интерфейс не виснет. ЧЯДНТ? Код
Насколько я понимаю, он по дефолту тоже запускает в бэкграунде, а у pashazz виснет из-за waitForFinished()? Название: Re: Запуск процесса в отдельном треде (Linux only) Отправлено: pashazz от Июнь 08, 2010, 21:53 Дело в том, что мне надо обязательно дождаться завершения процесса и ничего не делать, пока он завершится.
Название: Re: Запуск процесса в отдельном треде (Linux only) Отправлено: pashazz от Июнь 08, 2010, 21:59 Ладно, завтра сделаю чего-нибудь с QEventLoop
Название: Re: Запуск процесса в отдельном треде (Linux only) Отправлено: BRE от Июнь 08, 2010, 22:14 Дело в том, что мне надо обязательно дождаться завершения процесса и ничего не делать, пока он завершится. Ладно, завтра сделаю чего-нибудь с QEventLoop Для чего?Есть же: bool QProcess::waitForFinished ( int msecs = 30000 ) Название: Re: Запуск процесса в отдельном треде (Linux only) Отправлено: pashazz от Июнь 09, 2010, 03:08 вы вообще тред читали?
Название: Re: Запуск процесса в отдельном треде (Linux only) Отправлено: BRE от Июнь 09, 2010, 07:17 вы вообще тред читали? Честно говоря читал, только с разрывом во времени. Поэтому немного попутался. ;)Код
Название: Re: Запуск процесса в отдельном треде (Linux only) Отправлено: AlekseyK от Декабрь 18, 2010, 20:36 Цитата: Qt Documentation Synchronous Process API QProcess provides a set of functions which allow it to be used without an event loop, by suspending the calling thread until certain signals are emitted:
|