crossplatform.ru

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

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


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

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Расскажи, что значит "вешается GUI"?

Для чего в конце метода run() стоит вызов exec()? Что он по твоему должен делать?

Код:
    int size_arguments = arguments.size() - 1;
    for(int i = 0; i <= size_arguments; i++)

наверное лучше изменить на:
    int size_arguments = arguments.size();
    for(int i = 0; i < size_arguments; i++)

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 8.3.2010, 22:13
Сообщение #12


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

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

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




Репутация:   34  


BRE прав, тебе нужно определиться, хочешь ли ты вообще читать вывод mencoder'a? Если да, то от всяких wait* и циклов нужно избавляться в пользу создания списка с очередью.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flareguner
  опции профиля:
сообщение 8.3.2010, 22:20
Сообщение #13


Студент
*

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

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




Репутация:   0  


Цитата(SABROG @ 8.3.2010, 22:04) *
Цитата(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 вообще код работал или всё написано с нуля без проверок?


Да всё работает. Дело суть просто в том, что классу скармливаются аргументы а он отдает их QProcess. Но с самого начала этот способ подвешивал GUI.





Цитата
Расскажи, что значит "вешается GUI"?


То окно, в котором мы запускаем этот поток никак ни на что не реагирует. виден только прогрессбар и он ползет. и все.
Цитата
    int size_arguments = arguments.size() - 1;
    for(int i = 0; i <= size_arguments; i++)

наверное лучше изменить на:
    int size_arguments = arguments.size();
    for(int i = 0; i < size_arguments; i++)



Согласен :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 8.3.2010, 22:22
Сообщение #14


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

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

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




Репутация:   34  


Цитата(flareguner @ 8.3.2010, 22:18) *
Но с самого начала этот способ подвешивал GUI.


Вообще это всё странно, так как QProcess::start() работает в асинхронном режиме, в теории никакие QThread'ы не нужны, так как QProcess должен работать по аналогии с QNetworkAccessManager или QFtp.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flareguner
  опции профиля:
сообщение 8.3.2010, 22:24
Сообщение #15


Студент
*

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

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




Репутация:   0  


Цитата(SABROG @ 8.3.2010, 22:22) *
Цитата(flareguner @ 8.3.2010, 22:18) *
Но с самого начала этот способ подвешивал GUI.


Вообще это всё странно, так как QProcess::start() работает в асинхронном режиме, в теории никакие QThread'ы не нужны, так как QProcess должен работать по аналогии с QNetworkAccessManager или QFtp.



Да, именно это и странно. Тем более, что даже в потоке он вешает гуй.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.3.2010, 22:28
Сообщение #16


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

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


А покажи код, который запускает этот поток + как он соединяется со слотами. Короче всю обвязку.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 8.3.2010, 22:29
Сообщение #17


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

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

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




Репутация:   34  


Проверь управление доходит до строчки идущей за waitForFinished(), если да, то скажи мне какая максимальная цифра в size_arguments.

Возможно это глупое предположение, но возможно программа слишком быстро запускается и завершается, настолько быстро, что долгий цикл:

    for(int i = 0; i < size_arguments; i++)
    {
        ...
    emit passChanged( i + 1 );
    }


Просто напросто "зафлуживает" GUI'шный поток сообщениями, на каждое из которых выполняется какая-нибудь не быстрая операция.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
flareguner
  опции профиля:
сообщение 8.3.2010, 22:34
Сообщение #18


Студент
*

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

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




Репутация:   0  


Цитата(BRE @ 8.3.2010, 22:28) *
А покажи код, который запускает этот поток + как он соединяется со слотами. Короче всю обвязку.


Вот

Цитата(SABROG @ 8.3.2010, 22:29) *
Проверь управление доходит до строчки идущей за waitForFinished(), если да, то скажи мне какая максимальная цифра в size_arguments.

Возможно это глупое предположение, но возможно программа слишком быстро запускается и завершается, настолько быстро, что долгий цикл:

    for(int i = 0; i < size_arguments; i++)
    {
        ...
    emit passChanged( i + 1 );
    }


Просто напросто "зафлуживает" GUI'шный поток сообщениями, на каждое из которых выполняется какая-нибудь не быстрая операция.


Цикл завершается не быстро. Состоир из 1-2-3 итераций. Процесс конвертирования видео тоже не может проходить мгновенно. Я пробовал запускать такой же процесс вне треда и без ожидания завершения, и он не вешал GUI, хотя гуй парсил полностью вывод менкодера.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
BRE
  опции профиля:
сообщение 8.3.2010, 22:35
Сообщение #19


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

Группа: Участник
Сообщений: 1112
Регистрация: 6.3.2009
Из: Ростов-на-Дону
Пользователь №: 591

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




Репутация:   44  


Так я и думал, новый поток запускается через start(). :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
SABROG
  опции профиля:
сообщение 8.3.2010, 22:42
Сообщение #20


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

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

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




Репутация:   34  


Цитата(BRE @ 8.3.2010, 22:35) *
Так я и думал, новый поток запускается через start(). :)


У QThread другого и нету :blink:

Если речь о новом процессе, то какая разница?

А у меня такая еще идея появилась. Дочерний процесс настолько сильно грузит процессор (все-таки ни что нибудь, а перекодирование!), что забирает все ресурсы и у родительского процесса. Что если запустить mencoder через утилиту nice, с пониженным приоритетом? Да еще и QThread setPriority() пониже выставить?

Сообщение отредактировал SABROG - 8.3.2010, 22:44
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 23.5.2022, 23:40