У меня есть следующий код:Как использовать процесс (QProcess) в новом потоке (QThread)?
void Processmethod()
{
QDialog *ProcessMessage = new QDialog;
Ui::DialogProcessMessage Dialog;
Dialog.setupUi(ProcessMessage);
ProcessMessage->setModal(true);
ProcessMessage->setAttribute(Qt::WA_DeleteOnClose);
ProcessMessage->show();
qApp->processEvents();
processmethodONE();
processmethodTWO();
processmethodTHREE();
}
void processmethodONE()
{
QString ProcessCommand = "w8 " + blablubli";
Prozess.setWorkingDirectory(Path); //QProcess "Prozess" is globaly defined
Prozess.setStandardOutputFile(Path); //in my class
QThread* thread = new QThread;
Prozess.moveToThread(thread);
Prozess.start(ProcessCommand);
while(!Prozess.waitForFinished(2000))
{
std::cerr << "Process running " << std::endl;
}
QProcess::ExitStatus Status = Prozess.exitStatus();
if (Status == 0)
{
std::cout << "File created!" << std::endl;
}
}
В этом исходном коде я пытаюсь открыть всплывающее диалоговое окно, прежде чем начинают какие-то процессы. проблема в том, что диалог не доступен, но в диалоговом окне я хочу создать кнопку, чтобы прервать выполняемый метод. Как вы можете видеть, я попытался использовать QThread для запуска процесса (процессов) в другом потоке, но все же я не могу щелкнуть диалог. Кроме того, если я открываю приложение (GUI) с «application/x-executable» -file, содержимое диалоговых окон отсутствует при активации вышеуказанного метода. Как я могу исправить эти проблемы? Где я ошибаюсь? привет
У меня есть несколько вопросов ... 1) Как вы называете 'Processmethod()'? 2) Почему вы чувствуете, что вам нужно создать QThread и переместить QProcess в него? А также, почему вы не начинаете новый QThread? 3) Используете ли вы этот глобальный QProcess для всех своих 'processmethodX()'? – jdi
он не подходит с вопросом, но я бы предложил вам написать имена переменных в _lowerCamelCase_. Это очень читаемо. Однако я согласен с jdi, вам нужно больше информации для ответа. – jalone
Обычно нет необходимости запускать QProcess в потоке, поскольку его API не блокирует, если вы не используете методы waitForStarted/Finished. –