crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Помогите разобаться с потоками.
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
с начала разберись с этим, потом будешь усложнять задачу.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
franza
  опции профиля:
сообщение 9.1.2011, 22:41
Сообщение #3


Новичок


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

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




Репутация:   0  


виджеты создаются в главном потоке (по крайней мере в main.cpp), в run для каждого потока я написал только отправку сигналов, к которым в main.cpp коннектится соответствующий слот. здесь, думаю, я не ошибся. но при выполнении родительский виджет повисает и не дает себя ни перетаскивать ни закрывать, хотя по идее находится в отдельном потоке.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 9.1.2011, 23:41
Сообщение #4


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

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

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




Репутация:   94  


Цитата(franza @ 10.1.2011, 0:41) *
о при выполнении родительский виджет повисает и не дает себя ни перетаскивать ни закрывать, хотя по идее находится в отдельном потоке.
Цитата(Litkevich Yuriy @ 10.1.2011, 0:02) *
виджеты могут находится только в главном потоке.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 9.1.2011, 23:59
Сообщение #5


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


Чет мне подсказывает, что закидывать в while() сообщениями без пауз - это не лучший метод :) виджеты живут в основном потоке, но если они получают неприрывный поток сигналов, они это отрабатывают и не дают возможности сигналам и событиям перемещения прийти.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
franza
  опции профиля:
сообщение 10.1.2011, 0:23
Сообщение #6


Новичок


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

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




Репутация:   0  


ufna, то есть, в принципе, написано все правильно, только надо usleep(100500) написать?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ufna
  опции профиля:
сообщение 10.1.2011, 2:15
Сообщение #7


Активный участник
***

Группа: Участник
Сообщений: 362
Регистрация: 24.5.2008
Из: Курган/СПб
Пользователь №: 182

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




Репутация:   5  


Вообще по-хорошему не так делается :) Можно сделать класс "посылатель сигналов" и пихать его в поток, при этом не переопределяя поток, а делая moveToThread - это будет более правильно.

А здесь я не уверен насчет сигналов до exec() в потоке.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
franza
  опции профиля:
сообщение 10.1.2011, 16:47
Сообщение #8


Новичок


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

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




Репутация:   0  


ufna, можно поподробней?

Litkevich Yuriy, я имею ввиду, что этот отдельный поток, где создаются виджеты и есть главный.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 10.1.2011, 17:35
Сообщение #9


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

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

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




Репутация:   94  


franza, ту по-русски вообще понимаешь?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
franza
  опции профиля:
сообщение 10.1.2011, 18:28
Сообщение #10


Новичок


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

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




Репутация:   0  


Litkevich Yuriy, понимаю. Можешь попробовать рассказать о моей ошибке не в одном предложении, а подробнее, так как видно, что я мало понимаю. Мне непонятно следующее: 3 виджета (лсд, кнопка, и базовый, куда они помещаются) создаются в main.cpp. При этом они создаются в главном потоке или нет? Если нет, то как создать их в главном потоке? Слоты, к которым происходит коннект вызываются в главном потоке или нет?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 4.12.2024, 14:44