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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: сигнал в потоке  (Прочитано 5475 раз)
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
Гость
« Ответ #1 : Февраль 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
Гость
« Ответ #2 : Февраль 19, 2006, 13:29 »

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

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

И кстати, в 4-ом Qt соединения между потоками прекрасно устанавливаются и работают. QCustomEvent-ы больше не нужны.
Записан
QCasper
Гость
« Ответ #3 : Февраль 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
Гость
« Ответ #4 : Февраль 19, 2006, 20:30 »

Код:
run() { 
do {
   x = x+1;
   emit x_signal(x);
} while(1);
}


Не вижу причин по которым это не должно тормозить ж). Соединения сигналов и слотов между потоками на самом деле есть послыка/приём определённого события, которое представляет собой упаковку для обычного виндюшного сообщения. Окно разбирает новоприбывшие сообщения м на каждое делает определённое действие. Например при попытке изменить размер окна придёт сообщение WM_SIZE и тп. Так вот если слать эти сообщения с таким фанатизмом ж), то сообщения не будут успевать отрабатываться окном, отсюда и тормоза. Поэтому просто отсылай сигнал с уведомлением пореже. В простейшем случае поставь после emit маленькую задержку. Например usleep(1). Это даст нужный эффект.
Записан
Steven_Orko
Гость
« Ответ #5 : Февраль 19, 2006, 23:07 »

Цитата: "QCasper"
меня мучает несколько вопросов:

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

Да, ты прав, я забыл ее написать )))
Могу выслать приложение, где я так делал... С событиями... Если надо...
Записан
QCasper
Гость
« Ответ #6 : Февраль 20, 2006, 01:31 »

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


я ставлю задержку в 100 милисекунд, всеравно тормозит дико...[/quote]
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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