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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: Как контролировать отрисовку в виджете?  (Прочитано 12148 раз)
DAMAL
Гость
« Ответ #15 : Сентябрь 01, 2008, 17:50 »

Архитектура в двух словах выглядит так:

Код:
class ImageProcessor : public QThread
{
public:
    ImageProcessor();
    ~ImageProcessor();
private:
    myQLabel *frame_render;
    void run();
    bool dataReady;
};

void ImageProcessor::run()
{
    while( true ) {
        if(dataReady) {
            frame_render->setNextFrame( image_buffer );
        } else {
            Sleep(3);
        }
    }
}

class MainDialog : public QDialog
{
public:
    MainDialog();
    ~MainDialog();
};

int main(int argc, char *argv[])
{
    QApplication a( argc, argv );
    MainDialog *pDialog = new MainDialog();
    ImageProcessor *pProcessor = new ImageProcessor();
    a.exec();
    return 0;
}


Юзай тэги КОД плиз
« Последнее редактирование: Сентябрь 01, 2008, 17:53 от pastor » Записан
pastor
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 2901



Просмотр профиля WWW
« Ответ #16 : Сентябрь 01, 2008, 17:58 »

Ага, понятно. Т.е. экземпляр myQLabel создаеться, как я понимаю, в контрукторе ImageProcessor (а это не есть другой поток!), а юзаеться в другом потоке (метод ImageProcessor::run), верно? И это есть ошибка, про которую я писал выше. Из другого потока к гую обращаться напрямую нельзя, нужно юзали либо ивенты либы сигнал\слот. Когда нибудь приложение вылетит в кору, а вы не будете понимать почему. Советую этот момент переделать.

Upd:

Мой вопрос можно сказать снят. Я посморел реализацию myQLabel::setNextFrame, и все стало понятно:

Код:
void myQLabel::setNextFrame(unsigned char *bitmap)
{
    memcpy(image, bitmap, size);
    QCoreApplication::postEvent(this, new QEvent(QEvent::Paint));
}

Т.к. метод myQLabel::setNextFrame вызываеться из другого потока именно для этого и нужена строка

Код:
QCoreApplication::postEvent(this, new QEvent(QEvent::Paint));

Но вопросов стало больше после кода:

Код:
int main(int argc, char *argv[])
{
    QApplication a( argc, argv );
    MainDialog *pDialog = new MainDialog();
    ImageProcessor *pProcessor = new ImageProcessor();
    a.exec();
    return 0;
}

Кто запускает поток ImageProcessor? Для чего нужен MainDialog если он не показан?
« Последнее редактирование: Сентябрь 01, 2008, 18:06 от pastor » Записан

Integrated Computer Solutions, Inc. (ICS)
http://www.ics.com/
DAMAL
Гость
« Ответ #17 : Сентябрь 02, 2008, 21:11 »

Опишу практическое применение. Приложение представляет собой сетевой видео-плеер. Имеется главное окно (MainDialog), в котором задаются настройки и происходит инициация соединения с видео-сервером. После установления соединения создаётся объет класса ImageProcessor, принимающий видео-кадры по сети и отображающий их в видео-окне. Одновременно может быть создано несколько объектов класса ImageProcessor.
Вызов метода setNextFrame действительно происходит из другого потока, и только посылка события способом postEvent позволяет избежать асинхронных ошибок иксов.
К сожалению, мой старый компьютер, на котором наигрывалось накопление кадров, сгорел. Починю - сразу попробую методы flush() и sendPostedEvent(), очень надеюсь они помогут очищать очередь...
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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