crossplatform.ru

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


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

Введите в поле код из 6 символов, отображенных в виде изображения. Если вы не можете прочитать код с изображения, нажмите на изображение для генерации нового кода.
 

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


Последние 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 Текстовая версия Сейчас: 28.3.2024, 12:16