Russian Qt Forum

Qt => Общие вопросы => Тема начата: QCasper от Февраль 19, 2006, 03:32



Название: сигнал в потоке
Отправлено: QCasper от Февраль 19, 2006, 03:32
у меня класс унаследованный от QThread
допустим class My : public QThread {}
ну там как обычно перегруженный run() такого типа:

Код:

run() {
do {
   x = x+1;
   emit x_signal(x);
} while(1);
}


в классе скажем диалогового окна я делаю такую попытку:

Код:

My *my = new My;
QLabel *label = QLabel("", this);
connect(my, SIGNAL(x_signal(int)), label, SLOT(setNum(x));


ну и потом по нажатию на кнопку - my->start();

так вот лэйбл не меняется ни собаки... собсно как мне получить эти данные


Название: сигнал в потоке
Отправлено: Steven_Orko от Февраль 19, 2006, 10:58
Бланшет писал по этому поводу следующее.
1. Необходимо определить совй класс-событие:
Код:
enum {my_type_event = QEvent::User + 1}

class QMyEvent : public QEvent
{
public:
QMyEvent() : QEvent((QEvent::Type) my_type_event);
~QMyEvent() {};
};


2. Переопределить метод customEvent() у того объекта, где ты делаешь попытку:
Код:
void <Твой класс>::customEvent ( QEvent * event )
{
if (event->type() == my_type_event)
{
//Делаем что-то, например
label->setNum(event->x)
}
}

3. Посылаешь это событие из своего потока:
Код:
run() 
{
do
{
x = x+1;
QMyEvent* my_event = new QMyEvent();
my_event->x = x;
qApp->postEvent(<Указатель_на_твой_объект>, my_event);
} while(1);
}


Название: сигнал в потоке
Отправлено: ElderOrb от Февраль 19, 2006, 13:29
Не меняется потому что
Код:
connect(my, SIGNAL(x_signal(int)), label, SLOT(setNum(x));

не осуществляет соединения. ж). Попробуй SLOT(setNum(int))).

И кстати, в 4-ом Qt соединения между потоками прекрасно устанавливаются и работают. QCustomEvent-ы больше не нужны.


Название: сигнал в потоке
Отправлено: QCasper от Февраль 19, 2006, 18:38
меня мучает несколько вопросов:

как возможно label->setNum(event->x) (QEvent has no member x)
и я так понимаю в MyEvent надо добавить int x; в public, да?

добавлено спустя 2 минуты:

 
Цитата: "ElderOrb"
Не меняется потому что
Код:
connect(my, SIGNAL(x_signal(int)), label, SLOT(setNum(x));

не осуществляет соединения. ж). Попробуй SLOT(setNum(int))).

И кстати, в 4-ом Qt соединения между потоками прекрасно устанавливаются и работают. QCustomEvent-ы больше не нужны.


если не трудно, вышли пож., на мыло рабочее простое приложение с одним потоком и лэйблом. goacas@mail.ru

у меня там int конечно же - здесь просто опечатался

добавлено спустя 2 часа 19 минут:

 вобщем работает, когда просто отсылаю сигнал, у меня один вопрос:
ПОЧЕМУ ТАК ТОРМОЗИТ?? у кого-нить есть какое-нибудь графическое приложение с анимацией, мне интересно на Qt вообще реально что-нибудь подобное создать, чтобы так не тормозило....
я из потока отсылаю сигнал на свой графический виджет (стрелка там крутится типа как часы) тормозит зверски, а если связываю с этой стрелкой что-нить типа QSlider - то все плавненько без тормозов


Название: сигнал в потоке
Отправлено: ElderOrb от Февраль 19, 2006, 20:30
Код:
run() { 
do {
   x = x+1;
   emit x_signal(x);
} while(1);
}


Не вижу причин по которым это не должно тормозить ж). Соединения сигналов и слотов между потоками на самом деле есть послыка/приём определённого события, которое представляет собой упаковку для обычного виндюшного сообщения. Окно разбирает новоприбывшие сообщения м на каждое делает определённое действие. Например при попытке изменить размер окна придёт сообщение WM_SIZE и тп. Так вот если слать эти сообщения с таким фанатизмом ж), то сообщения не будут успевать отрабатываться окном, отсюда и тормоза. Поэтому просто отсылай сигнал с уведомлением пореже. В простейшем случае поставь после emit маленькую задержку. Например usleep(1). Это даст нужный эффект.


Название: сигнал в потоке
Отправлено: Steven_Orko от Февраль 19, 2006, 23:07
Цитата: "QCasper"
меня мучает несколько вопросов:

как возможно label->setNum(event->x) (QEvent has no member x)
и я так понимаю в MyEvent надо добавить int x; в public, да?

Да, ты прав, я забыл ее написать )))
Могу выслать приложение, где я так делал... С событиями... Если надо...


Название: сигнал в потоке
Отправлено: QCasper от Февраль 20, 2006, 01:31
Цитировать
Не вижу причин по которым это не должно тормозить ж). Соединения сигналов и слотов между потоками на самом деле есть послыка/приём определённого события, которое представляет собой упаковку для обычного виндюшного сообщения. Окно разбирает новоприбывшие сообщения м на каждое делает определённое действие. Например при попытке изменить размер окна придёт сообщение WM_SIZE и тп. Так вот если слать эти сообщения с таким фанатизмом ж), то сообщения не будут успевать отрабатываться окном, отсюда и тормоза. Поэтому просто отсылай сигнал с уведомлением пореже. В простейшем случае поставь после emit маленькую задержку. Например usleep(1). Это даст нужный эффект.


я ставлю задержку в 100 милисекунд, всеравно тормозит дико...[/quote]