crossplatform.ru

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

> Помогите разобаться с потоками.
franza
  опции профиля:
сообщение 9.1.2011, 21:02
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 8
Регистрация: 3.1.2011
Пользователь №: 2323

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




Репутация:   0  


Я начинающий в Qt. Разбираюсь с многопоточностью и не могу написать код, который одновременно менял значение QLCDNumber и постоянно нажимает кнопочку. Прошу помочь разобраться.

lcdthread.h

#ifndef LCDTHREAD_H
#define LCDTHREAD_H

#include <QThread>

class LCDThread : public QThread
{
    Q_OBJECT
private:
    int m_nValue;
public:
    LCDThread(QObject *parent = 0);
    void run();
signals:
    void currentValue(int);
};

#endif // LCDTHREAD_H


pbthread.h
#ifndef PBTHREAD_H
#define PBTHREAD_H

#include <QThread>

class PBThread : public QThread
{
    Q_OBJECT
public:
    PBThread(QObject *parent = 0);
    void run();
signals:
    void finished();
    void click();
public slots:
    void slotClick();
};

#endif // PBTHREAD_H


lcdthread.cpp
#include "lcdthread.h"
#include <QTimer>
LCDThread::LCDThread(QObject *parent) :
    QThread(parent),
    m_nValue(0)
{
}
void LCDThread::run()
{
    while (true) {
        emit currentValue(++m_nValue);
    }
    exec();
}


pbthread.cpp
#include "pbthread.h"

PBThread::PBThread(QObject *parent) :
    QThread(parent)
{
}
void PBThread::run()
{
    while(true) {
        emit click();
    }

    exec();
}

void PBThread::slotClick()
{
    emit click();
}


main.cpp
#include <QtGui>
#include "lcdthread.h"
#include "pbthread.h"
int main(int argc, char** argv)
{
    QApplication a(argc, argv);

    QLCDNumber *plcd = new QLCDNumber(8);
    LCDThread lcdThread;
    plcd->setSegmentStyle(QLCDNumber::Flat);

    QObject::connect(&lcdThread, SIGNAL(currentValue(int)), plcd, SLOT(display(int)));

    QPushButton *ppbutton = new QPushButton("PUSH, FUCKING PSUH");
    PBThread pbThread;

    QObject::connect(&pbThread, SIGNAL(click()), ppbutton, SLOT(animateClick()));

    QWidget wgt;
    QHBoxLayout *l = new QHBoxLayout;
    l->addWidget(plcd);
    l->addWidget(ppbutton);
    wgt.setLayout(l);

    lcdThread.start();
    pbThread.start();
    wgt.show();
    return a.exec();
}


Не могу сделать так, чтобы родительский виджет был доступен для перетаскиваний и прочего. Или для него надо писать свой поток?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
 
Начать новую тему
Ответов
Litkevich Yuriy
  опции профиля:
сообщение 9.1.2011, 22:02
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

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




Репутация:   94  


виджеты могут находится только в главном потоке. Но ими можно управлять через сигналы и слоты из других потоков.

П.С.
Цитата(franza @ 9.1.2011, 23:02) *
не могу написать код, который одновременно менял значение QLCDNumber
с начала разберись с этим, потом будешь усложнять задачу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


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




RSS Текстовая версия Сейчас: 29.11.2024, 11:29