186 / 61 / 4
Регистрация: 29.04.2011
Сообщений: 641
1

Передача сигналов между потоками

31.05.2012, 11:57. Показов 6478. Ответов 16
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
у qt есть какието ограничения на передачу сигналов из дочернего потока в главный?
пишу
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
{
    //кусок из конструктора класса Game
    styl_t=new styl_thread(this);
    connect(styl_t,SIGNAL(signal_changeStylPixmap(QPixmap&)),this,SLOT(changeStylPixmap(QPixmap&)));
}
 
void Game::changeStylPixmap(QPixmap &px)
{
    label_s->setPixmap(px);
}
также есть класс styl_thread
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class styl_thread : public QThread
{
    Q_OBJECT
public:
    explicit styl_thread(QObject *parent = 0);
 
    void run();
signals:
    void signal_changeStylPixmap(QPixmap &a);
 
 
public slots:
 
 
private:
    QPixmap stylPixmap;
 
};
 
 
styl_thread::styl_thread(QObject *parent) :
    QThread(parent)
{
    stylPixmap=QPixmap(":img/styl.png");
}
 
void styl_thread::run()
{
 
    QPixmap px1(stylPixmap);
    QPainter p;
    QPointF center(px1.width() / qreal(2), px1.height() / qreal(2));
    p.begin(&px1);
 
    p.translate(center);
    p.rotate(45);
    p.translate(-center);
 
 
    p.drawPixmap(QPointF(0, 0), px1);
 
 
    p.end();
 
 
    emit signal_changeStylPixmap(px1);
 
 
}
внутри run() все работает правельно.
строка emit signal_changeStylPixmap(px1); срабатывает, однако слот void Game::changeStylPixmap(QPixmap &px) не вызывается

Мне кажется что проблема из-за потоков. Как это исправить
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
31.05.2012, 11:57
Ответы с готовыми решениями:

Передача данных между потоками
Изучаю многопоточные приложения. Есть 2 потока, в основном окне есть поле ввода, надо как-то...

Передача данный между потоками
Доброго времени суток. Вопрос следующий! Предположим имеется 2 пока (GUI и второй). Возможно ли...

Передача данных между потоками
Подскажите пожалуйста как передать объект между потоками через сигнал-слот? у меня выдает следующее...

Сигналы между потоками
Подскажите, что не так с моими изысканиями в использовании потоков в Qt Проблема в том, что не...

16
60 / 60 / 6
Регистрация: 28.05.2012
Сообщений: 222
31.05.2012, 12:31 2
Покажи определение класса Game. Прописано ли в нем Q_OBJECT? От каких классов наследуется Game?
У меня сообщения между потоками передаються без проблем.
0
186 / 61 / 4
Регистрация: 29.04.2011
Сообщений: 641
31.05.2012, 12:36  [ТС] 3
наследую от QWidget
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
class Game : public QWidget
{
 
 
    Q_OBJECT
 
    
 
 
public:
    explicit Game(QWidget *parent = 0);
    ~Game();
 
 
    void move_label(int n);
   
    QLabel *label_p;
    QLabel *label_s;
   
    QPainter * paint;
    styl_thread *styl_t;
 
 
 
 
 
 
 
 
 
 
 
 
 
signals:
    void signal_lets_move(int i,int x,int y);
 
public slots:
    void move_p(int s);
    void click_space();
    void focus_me();
    void changeStylPixmap(QPixmap &px);
 
 
    void start_game();
 
 
 
};
0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
31.05.2012, 13:01 4
нету, да же больше скажу, передача данных между потоками должна быть осуществлена ТОЛЬОКО С ПОМОЩЬЮ сингалов и слотов!
0
186 / 61 / 4
Регистрация: 29.04.2011
Сообщений: 641
31.05.2012, 13:07  [ТС] 5
хм... в чем же тогда у меня проблема..
может я поток не так создаю?
0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
31.05.2012, 13:43 6
попробуйте не ссылки передавать, а значения. и в дебагере ничего не пишет на тему: не могу связать сигнал и слот?
1
60 / 60 / 6
Регистрация: 28.05.2012
Сообщений: 222
31.05.2012, 13:53 7
Для теста быстро накидал пример. У меня он отлично работает. Посмотри, может найдешь отличия.
P.S. кстати в сигнале передаю ссылку.
Вложения
Тип файла: zip ThreadTest.zip (1.8 Кб, 185 просмотров)
1
186 / 61 / 4
Регистрация: 29.04.2011
Сообщений: 641
31.05.2012, 13:58  [ТС] 8
Цитата Сообщение от l_a_m Посмотреть сообщение
попробуйте не ссылки передавать, а значени
спасибо,теперь заходит внутрь слота
картинка не появляется, ну я попозже буду смотреть где накосячил

Добавлено через 37 секунд
Demy85, щас я ухожу, завтра наверно посмотрю, спасибо
0
60 / 60 / 6
Регистрация: 28.05.2012
Сообщений: 222
31.05.2012, 14:01 9
Кстати, скажи ты программу создаешь под Linux или Windows?
0
Эксперт С++
1936 / 1048 / 109
Регистрация: 29.03.2010
Сообщений: 3,167
31.05.2012, 14:40 10
Цитата Сообщение от Demy85 Посмотреть сообщение
Linux или Windows
а какая разница? О_о

Добавлено через 18 секунд
на то ж он и Qt
1
60 / 60 / 6
Регистрация: 28.05.2012
Сообщений: 222
31.05.2012, 14:54 11
Цитата Сообщение от l_a_m Посмотреть сообщение
а какая разница? О_о
У Windows существуют процессы и потоки, а в Linux только процессы. Сам понимаешь что передача параметров между процессами и передача параметров между потоками различаются. Если между потоками можно передать адрес объекта, то между процессами такого сделать нельзя.

P.S. Я сейчас почитал некоторую информацию по Linux, в принципе разницы не должно быть, но все равно любопытно.
1
186 / 61 / 4
Регистрация: 29.04.2011
Сообщений: 641
31.05.2012, 18:12  [ТС] 12
вообще
Цитата Сообщение от Demy85 Посмотреть сообщение
Windows
Добавлено через 6 минут
Demy85, вроде все так же, только вопрос:
в чем разница между inherited(pParent) и например QWidget(pParent)
0
60 / 60 / 6
Регистрация: 28.05.2012
Сообщений: 222
01.06.2012, 11:53 13
Цитата Сообщение от ЛеЖиК) Посмотреть сообщение
Demy85, вроде все так же, только вопрос:
в чем разница между inherited(pParent) и например QWidget(pParent)
Разницы нет. Я так пишу чтобы можно было легко и быстро подменить предка.

P.S. Извини, а так же - это работает или нет?
0
186 / 61 / 4
Регистрация: 29.04.2011
Сообщений: 641
01.06.2012, 13:29  [ТС] 14
так же- у меня вроде все в коде с тобой одинаково
да работает- сигнал срабатывает, но получилось что не работало из-за ссылок
0
60 / 60 / 6
Регистрация: 28.05.2012
Сообщений: 222
04.06.2012, 09:53 15
Цитата Сообщение от ЛеЖиК) Посмотреть сообщение
так же- у меня вроде все в коде с тобой одинаково
да работает- сигнал срабатывает, но получилось что не работало из-за ссылок
Тогда вопрос: какой версией Qt пользуешься?
0
186 / 61 / 4
Регистрация: 29.04.2011
Сообщений: 641
04.06.2012, 11:03  [ТС] 16
4.7.4
0
60 / 60 / 6
Регистрация: 28.05.2012
Сообщений: 222
04.06.2012, 11:33 17
Цитата Сообщение от ЛеЖиК) Посмотреть сообщение
4.7.4
Тогда даже представления не имею.
0
04.06.2012, 11:33
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.06.2012, 11:33
Помогаю со студенческими работами здесь

Связь между потоками
Пытаюсь реализовать змейку на qt и вот остановился на моменте связи между основным и другим...

Сигналы и слоты между потоками
Имеется окно с кнопкой, и класс который делает "невероятно сложные" вычисления... соединяем сигнал...

Синхронизация итераций между потоками
Добрый день. Сразу скажу, что облазил все доступные мне офф. доки по Qt и полгугла, но не нашел...

Общие данные между двумя потоками
Добрый вечер. Начал учить Qt5. Написал программку про потоки. Хочу написать программку, у которой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru