crossplatform.ru

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


  Ответ в Как запустить QThread чтобы он не вешал GUI?
Введите ваше имя
Подтвердите код

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
Теги
Выровнять по центру
Ссылка на тему
Ссылка на сообщение
Скрытый текст
Сокращение
Код с подсветкой
Offtopic
 
Удалить форматирование
Спец. элементы
Шрифт
Размер
 
Цвет шрифта
 
Отменить ввод
Вернуть ввод
Полужирный
Курсив
Подчеркнутый
 
 
Смайлики
Вставить изображение
Вставить адрес электронной почты
Цитата
Код
Раскрывающийся текст
 
Увеличить отступ
По левому краю
По центру
По правому краю
Вставить список
Вставить список

Опции сообщения
 Включить смайлы?
Иконки сообщения
(Опционально)
                                
                                
  [ Без иконки ]
 


Последние 10 сообщений [ в обратном порядке ]
SABROG Дата 9.3.2010, 0:56
 
Цитата(flareguner @ 9.3.2010, 0:45) *
Может я что-то путаю, но разве можно в дочернем классе переопределять private-элементы? Вроде бы только protected.


Я не пробовал, но вроде как это ограничение не распространяется на чистые виртуальные функции. К тому же это опять не решит нашей проблемы, спецификатор доступа у наследуемого класса для такой функции можно выбрать любой :(
flareguner Дата 9.3.2010, 0:45
 
Цитата(SABROG @ 9.3.2010, 0:18) *
Цитата(flareguner @ 9.3.2010, 0:01) *
вроде макрос Q_OBJECT делает что-то подобное.


Если тролли поменяют объявление метода run() на такое, то возможно ошибок будет меньше:

private:
    virtual void run() = 0;





Может я что-то путаю, но разве можно в дочернем классе переопределять private-элементы? Вроде бы только protected.
SABROG Дата 9.3.2010, 0:18
 
Цитата(flareguner @ 9.3.2010, 0:01) *
вроде макрос Q_OBJECT делает что-то подобное.


Если тролли поменяют объявление метода run() на такое, то возможно ошибок будет меньше:

private:
    virtual void run() = 0;
flareguner Дата 9.3.2010, 0:01
 
Цитата(SABROG @ 8.3.2010, 23:06) *
Цитата(DEADHUNT @ 8.3.2010, 22:57) *
это уже не запуск, а простой вызов метода. только тогда не понятно зачем QThread использовать.


Так и есть. Интересно почему тролли не поместили метод run() в protected секцию, тогда бы можно было бы его спокойно наследовать и при этом невозможно было бы его вызвать за пределами класса QThread и наследников, а только через start(). Брр, ничего не понимаю, он в protected секции. Почему-то его возможно вызвать :huh: ? Ой, кое-кто его вытащил "наружу":

class QMCToolProcessor :
    public QThread
{
    Q_OBJECT
    public:
    void setArguments ( const QStringList & );
    void setArguments ( const QString & );

    void run( );
    protected:
    QStringList arguments;
    QProcess *process;
    private slots:
    void hasStderr();
    void hasStdout();
    signals:
    void processHasStderr( QByteArray );
    void processHasStdout( QByteArray );



    void passChanged( int );
};


Вопрос к знатокам C++, возможно ли создать класс с protected членами, которым бы невозможно было бы поменять спецификатор доступа при наследовании?
Теоретически можно сделать run() чистой виртуальной функцией с private спецификатором доступа. Вот только наследование от QObject'a может не дать это сделать.





вроде макрос Q_OBJECT делает что-то подобное.
SABROG Дата 8.3.2010, 23:06
 
Цитата(DEADHUNT @ 8.3.2010, 22:57) *
это уже не запуск, а простой вызов метода. только тогда не понятно зачем QThread использовать.


Так и есть. Интересно почему тролли не поместили метод run() в protected секцию, тогда бы можно было бы его спокойно наследовать и при этом невозможно было бы его вызвать за пределами класса QThread и наследников, а только через start(). Брр, ничего не понимаю, он в protected секции. Почему-то его возможно вызвать :huh: ? Ой, кое-кто его вытащил "наружу":

class QMCToolProcessor :
    public QThread
{
    Q_OBJECT
    public:
    void setArguments ( const QStringList & );
    void setArguments ( const QString & );

    void run( );
    protected:
    QStringList arguments;
    QProcess *process;
    private slots:
    void hasStderr();
    void hasStdout();
    signals:
    void processHasStderr( QByteArray );
    void processHasStdout( QByteArray );



    void passChanged( int );
};


Вопрос к знатокам C++, возможно ли создать класс с protected членами, которым бы невозможно было бы поменять спецификатор доступа при наследовании?
Теоретически можно сделать run() чистой виртуальной функцией с private спецификатором доступа. Вот только наследование от QObject'a может не дать это сделать.
DEADHUNT Дата 8.3.2010, 22:57
 
Цитата(SABROG @ 8.3.2010, 22:51) *
так как ты запустил поток через run(), а не через start().

это уже не запуск, а простой вызов метода. только тогда не понятно зачем QThread использовать.
flareguner Дата 8.3.2010, 22:55
 
Цитата(BRE @ 8.3.2010, 22:46) *
Цитата(SABROG @ 8.3.2010, 22:42) *
Если речь о новом процессе, то какая разница?

Камрад flareguner запускает новый поток вызовом метода run, т.е. новый поток не создается вообще.


Цитата(flareguner @ 8.3.2010, 22:44) *
А разве не run()-ом я его запускаю в файле video_converter.cpp? :rolleyes:

run это тело потока, а для того что бы он запустился в отдельном потоке, нужно его запускать через start().



Вот это я облажался. Ну что же, больше всем вам спасибо что помогли и не поленились разгребать пионерский г-нокод. :clapping:
SABROG Дата 8.3.2010, 22:51
  Всё, нашел:

    processor->setArguments( stage2 );
    processor->run(); //!!!


flareguner, я ж просил все исходники выложить. Вторую ссылку не заметил :(

Цитата
Это тоже мысль. Сейчас опробую.

Да не поможет. Твоя проблема в waitForFinished(), он блокирует основной цикл событий, так как ты запустил поток через run(), а не через start().
flareguner Дата 8.3.2010, 22:46
 
Цитата
Что если запустить mencoder через утилиту nice, с пониженным приоритетом? Да еще и QThread setPriority() пониже выставить?



Это тоже мысль. Сейчас опробую.
BRE Дата 8.3.2010, 22:46
 
Цитата(SABROG @ 8.3.2010, 22:42) *
Если речь о новом процессе, то какая разница?

Камрад flareguner запускает новый поток вызовом метода run, т.е. новый поток не создается вообще.


Цитата(flareguner @ 8.3.2010, 22:44) *
А разве не run()-ом я его запускаю в файле video_converter.cpp? :rolleyes:

run это тело потока, а для того что бы он запустился в отдельном потоке, нужно его запускать через start().
Просмотр темы полностью (откроется в новом окне)
RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 13.7.2025, 16:57