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();
}


Не могу сделать так, чтобы родительский виджет был доступен для перетаскиваний и прочего. Или для него надо писать свой поток?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V  < 1 2  
Начать новую тему
Ответов (10 - 11)
Litkevich Yuriy
  опции профиля:
сообщение 10.1.2011, 19:13
Сообщение #11


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

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

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




Репутация:   94  


Цитата(franza @ 10.1.2011, 18:47) *
я имею ввиду, что этот отдельный поток, где создаются виджеты и есть главный.
лучше главный поток и называть главным, чтобы никого столку не сбивать.
Цитата(franza @ 10.1.2011, 20:28) *
3 виджета (лсд, кнопка, и базовый, куда они помещаются) создаются в main.cpp. При этом они создаются в главном потоке или нет?
Да. Всё что не является наследником QThread и не использует moveToThread() находится в главном потоке.

Цитата(Litkevich Yuriy @ 10.1.2011, 20:45) *
Всё что не является наследником QThread
если быть более точным, то - сам наследник QThread создаётся в главном потоке, а затем вызывается его метод start(), который, в свою очередь, вызывает метод run(). Дак вот именно метод run() и выполняется в отдельном потоке, и как следствие, все объекты созданные в методе run() находятся в отдельном потоке.



Цитата(franza @ 10.1.2011, 20:28) *
Слоты, к которым происходит коннект вызываются в главном потоке или нет?
Слоты находятся в том потоке, в котором находится их объект. Если у тебя все виджеты в главном потоке, то и их слоты соответственно тоже в главном потоке, но это справедливо для соединений типа "авто" (по умолчанию) и "в очередь"(queued).



Цитата(ufna @ 10.1.2011, 4:15) *
А здесь я не уверен насчет сигналов до exec() в потоке.
Собственноручно посылать сигнал можно, а вот, например, сигнал от таймера (созданного здесь же) уже посылаться не будет, т.к. локальная очередь событий не запущена и в таймере не произойдёт события "таймаут"

Ну а вообще:
Цитата(ufna @ 10.1.2011, 1:59) *
... виджеты живут в основном потоке, но если они получают неприрывный поток сигналов, они это отрабатывают и не дают возможности сигналам и событиям перемещения прийти.
+100
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
franza
  опции профиля:
сообщение 10.1.2011, 19:24
Сообщение #12


Новичок


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

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




Репутация:   0  


спасибо, вроде разобрался. напишу еще, если появятся вопросы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 13.5.2024, 4:15