Название: сигнал в потоке Отправлено: QCasper от Февраль 19, 2006, 03:32 у меня класс унаследованный от QThread
допустим class My : public QThread {} ну там как обычно перегруженный run() такого типа: Код:
в классе скажем диалогового окна я делаю такую попытку: Код:
ну и потом по нажатию на кнопку - my->start(); так вот лэйбл не меняется ни собаки... собсно как мне получить эти данные Название: сигнал в потоке Отправлено: Steven_Orko от Февраль 19, 2006, 10:58 Бланшет писал по этому поводу следующее.
1. Необходимо определить совй класс-событие: Код: enum {my_type_event = QEvent::User + 1} 2. Переопределить метод customEvent() у того объекта, где ты делаешь попытку: Код: void <Твой класс>::customEvent ( QEvent * event ) 3. Посылаешь это событие из своего потока: Код: run() Название: сигнал в потоке Отправлено: 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() { Не вижу причин по которым это не должно тормозить ж). Соединения сигналов и слотов между потоками на самом деле есть послыка/приём определённого события, которое представляет собой упаковку для обычного виндюшного сообщения. Окно разбирает новоприбывшие сообщения м на каждое делает определённое действие. Например при попытке изменить размер окна придёт сообщение 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] |