crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

4 страниц V   1 2 3 > »   
Ответить в данную темуНачать новую тему
> Как запустить QThread чтобы он не вешал GUI?
flareguner
  опции профиля:
сообщение 8.3.2010, 17:53
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 16.11.2009
Пользователь №: 1231

Спасибо сказали: 0 раз(а)




Репутация:   0  


Я пробовал сделать так, как в примере в документации. Унаследовал QThread в классе и переопределил функцию void run(). Затем в другом приложении создал объект этого своего класса и запускаю его. GUI вешается и почти не отзывается. Большое спасибо тем, кто ответит.

Чуть не забыл: в классе наследующем поток мы ждем выполнения QProcess с waitForFinished( -1 ).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 8.3.2010, 20:01
Сообщение #2


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Я конечно могу задавать наводящие вопросы, типа "где создается QProcess?", но быстрее будет, если ты выложишь исходники.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flareguner
  опции профиля:
сообщение 8.3.2010, 21:17
Сообщение #3


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 16.11.2009
Пользователь №: 1231

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(SABROG @ 8.3.2010, 20:01) *
Я конечно могу задавать наводящие вопросы, типа "где создается QProcess?", но быстрее будет, если ты выложишь исходники.


src


Из defines.h там только модифицированный дебаг.

В используем мы его так:

QMCToolProcessor *processor = new QMCToolProcessor;

processor->setArguments( argument_list );
processor->run();


Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 8.3.2010, 21:48
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


QProcess::waitForStarted добавь и посмотри что от тебе вернёт.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 8.3.2010, 21:50
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Не увидел ничего такого, что бы могло вешать GUI. Посмотри аналогичный вариант Проверь работает ли он у тебя или сравни код. Qt в консоль никаких сообщений не пишет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flareguner
  опции профиля:
сообщение 8.3.2010, 21:55
Сообщение #6


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 16.11.2009
Пользователь №: 1231

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(DEADHUNT @ 8.3.2010, 21:48) *
QProcess::waitForStarted добавь и посмотри что от тебе вернёт.


Подробнее, куда добавить? Может вы имели в виду waitForStarted для объекта process?

Цитата(SABROG @ 8.3.2010, 21:50) *
Не увидел ничего такого, что бы могло вешать GUI. Посмотри аналогичный вариант Проверь работает ли он у тебя или сравни код. Qt в консоль никаких сообщений не пишет?



Посмотрю. Qt ничем не плюется.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 8.3.2010, 21:57
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


Цитата(flareguner @ 8.3.2010, 21:55) *
Подробнее, куда добавить? Может вы имели в виду waitForStarted для объекта process?

да для process, прежде чем ждать его завершения, надо дождаться его запуска(и проверить, запускается ли он вообще).
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flareguner
  опции профиля:
сообщение 8.3.2010, 22:02
Сообщение #8


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 16.11.2009
Пользователь №: 1231

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(SABROG @ 8.3.2010, 21:50) *
Не увидел ничего такого, что бы могло вешать GUI. Посмотри аналогичный вариант Проверь работает ли он у тебя или сравни код. Qt в консоль никаких сообщений не пишет?



Мой код отличался тем, что небыло конструктора и деструктора. Их дописание ничего не изменило( Если это интересно, то в треде должен запускаться mencoder.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 8.3.2010, 22:04
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 1207
Регистрация: 8.12.2008
Из: Russia, Moscow
Пользователь №: 446

Спасибо сказали: 229 раз(а)




Репутация:   34  


Цитата(DEADHUNT @ 8.3.2010, 21:57) *
Цитата(flareguner @ 8.3.2010, 21:55) *
Подробнее, куда добавить? Может вы имели в виду waitForStarted для объекта process?

да для process, прежде чем ждать его завершения, надо дождаться его запуска(и проверить, запускается ли он вообще).


Не будет разницы никакой:

bool QProcess::waitForFinished(int msecs)
{
    Q_D(QProcess);
    if (d->processState == QProcess::NotRunning)
        return false;
    if (d->processState == QProcess::Starting) {
        QTime stopWatch;
        stopWatch.start();
        bool started = waitForStarted(msecs);
        if (!started)
            return false;
        if (msecs != -1)
            msecs -= stopWatch.elapsed();
    }

    return d->waitForFinished(msecs);
}


После вызова start() QProcess переходит в состояние Starting. Если даже это состояние поменялось на NotRunning в следтвии ошибки, то waitForFinished() об этом сразу увидит, если же мы всё еще в состоянии Starting, то он сам сам вызывает waitForStarted(). Ну и затем waitForFinished(), если всё удачно.

Цитата(flareguner @ 8.3.2010, 22:02) *
Мой код отличался тем, что небыло конструктора и деструктора. Их дописание ничего не изменило( Если это интересно, то в треде должен запускаться mencoder.


Проверь с какой-нибудь другой утилитой. Без QThread вообще код работал или всё написано с нуля без проверок?

Сообщение отредактировал SABROG - 8.3.2010, 22:07
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flareguner
  опции профиля:
сообщение 8.3.2010, 22:05
Сообщение #10


Студент
*

Группа: Участник
Сообщений: 21
Регистрация: 16.11.2009
Пользователь №: 1231

Спасибо сказали: 0 раз(а)




Репутация:   0  


Цитата(DEADHUNT @ 8.3.2010, 21:57) *
Цитата(flareguner @ 8.3.2010, 21:55) *
Подробнее, куда добавить? Может вы имели в виду waitForStarted для объекта process?

да для process, прежде чем ждать его завершения, надо дождаться его запуска(и проверить, запускается ли он вообще).




Добавил его между start и waitForFinished. Возвращает истину.

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

4 страниц V   1 2 3 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.1.2021, 0:13