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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Очередь событий потока  (Прочитано 11386 раз)
inforse
Гость
« Ответ #15 : Октябрь 26, 2012, 09:43 »

Код:
QModelIndexList currentSelection = tableWidget->selectionModel()->selectedIndexes();
    for ( int i = 0; i < currentSelection.count(); ++i){
        if ( currentSelection.at(i).column() == 1 ) {continue;}
        int roow = currentSelection.at(i).row();
        nameBase = tableWidget->item(roow, 0)->text();
        qDebug() << nameBase;

        emit proc();

void sevice::reindex()
{
    QString rex = ("g");
    rex = rex.arg(nameBase, dbNamer, pr);

    //textBrowser->clear();
    textBrowser->append(rex);

    serviceP.start(rex);
    cansel->setEnabled(true);
В начале я вынимаю параметры которые выделены, и запускаю процесс serviceP.start(rex), вот если параметр всего один, он замечательно выполняется, окно не замораживается. Если запускаются два процесса, последовательно (параллельно он не запускает их) то окно замораживается до выполения обоих. waitforfinished тоже самое. Я контралирую процесс, и вывожу информацию с него в TextBrowser. Если использовать startDetached, то в винде всплывает cmd, с сообщениями о ходе выполнения процесса, и эти сообщения у меня не перехватываются
Код:
connect(&serviceP, SIGNAL(readyReadStandardOutput()), this, SLOT(updateOutputTextEdit()));
void sevice::updateOutputTextEdit()
{
    QByteArray newData = serviceP.readAllStandardOutput();
    QString text = textBrowser->toPlainText() + QString::fromLocal8Bit(newData);
    textBrowser->setPlainText(text);
    scrolDown();

}
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #16 : Октябрь 26, 2012, 13:25 »

В начале я вынимаю параметры которые выделены, и запускаю процесс serviceP.start(rex), вот если параметр всего один, он замечательно выполняется, окно не замораживается. Если запускаются два процесса, последовательно (параллельно он не запускает их) то окно замораживается до выполения обоих. waitforfinished тоже самое.
Наверное "если процесс всего один" т.к. "параметры" - это аргументы командной строки. Ну ладно, не суть.
Главное что бросается в глаза: чего Вы используете один экземпляр класса QProcess (serviceP) и ожидаете от него выполнения 2 и более процессов Непонимающий Делайте QProcess на каждый запуск и храните указатели на них в контейнере, напр
Код
C++ (Qt)
serviceP.push_back(new QProcess());
serviceP.back()->start(rex);
 
« Последнее редактирование: Октябрь 26, 2012, 13:27 от Igors » Записан
inforse
Гость
« Ответ #17 : Октябрь 26, 2012, 15:04 »

Ну хорошо, только я не запускаю более одного действия, я жду когда завершится первый процесс, затем запускаю его с другим аргументом. И все это время форма "заморожена".
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #18 : Октябрь 26, 2012, 15:29 »

Ну хорошо, только я не запускаю более одного действия, я жду когда завершится первый процесс, затем запускаю его с другим аргументом. И все это время форма "заморожена".
Вы давеча писали
вот если параметр всего один, он замечательно выполняется, окно не замораживается.
Так как Вас понять?  Улыбающийся

Можно ли использовать один экземпляр QProcess для запуска процессов одного за другим? Этого я не знаю, и даже не хочу знать Улыбающийся. Это здесь совершенно не нужно, даже с одним процессом гораздо выгоднее работать через указатель, напр
Код
C++ (Qt)
QProcess * theProc = 0;
..
if (theProc) {   // ага, процесс еще живет
..                
}
else {
theProc = new QProcess();  // создаем и запускаем
theProc->start(arg);
}
..
delete theProc;  // отработал, удаляем и зачищаем указатель
theProc = 0;
 
Записан
andrew.k
Гость
« Ответ #19 : Октябрь 26, 2012, 15:49 »

Ну хорошо, только я не запускаю более одного действия, я жду когда завершится первый процесс, затем запускаю его с другим аргументом. И все это время форма "заморожена".
Вы давеча писали
вот если параметр всего один, он замечательно выполняется, окно не замораживается.
Так как Вас понять?  Улыбающийся

Можно ли использовать один экземпляр QProcess для запуска процессов одного за другим? Этого я не знаю, и даже не хочу знать Улыбающийся. Это здесь совершенно не нужно, даже с одним процессом гораздо выгоднее работать через указатель, напр
Можно. В этом нет ничего страшного. Главное первый должен завершиться, перед использованием второго.

Плюс запуск процесса занимает время. Поэтому неплохо использовать функцию waitForStarted
Цитировать
Note: Processes are started asynchronously, which means the started() and error() signals may be delayed. Call waitForStarted() to make sure the process has started (or has failed to start) and those signals have been emitted.
А после waitForFinished, если это необходимо.

А по приведенному фрагменту кода вообще понять что-то сложно.
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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