С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/8: Рейтинг темы: голосов - 8, средняя оценка - 4.50
1 / 1 / 0
Регистрация: 20.09.2017
Сообщений: 134

Сигнал-слот между классом MainWindow и классом другого потока программы

27.04.2021, 19:10. Показов 1831. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В главном потоке происходят свои действия, а во втором - вычитание какого-то счётчика. При этом отображение после каждого вычитания должно выводиться на предназначенный для таймера виджет в главном окне.

mainwindow.h:

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
namespace Ui
{
    class MainWindow;
}
 
class TimerLoop;
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = 0); // конструктор главного окна
    ~MainWindow();                            // деструктор главного окна
 
private slots:
    void on_push_start_button_clicked();      // слот обработки нажатия кнопки на главном окне
 
public slots:
    void get_clock(int count);
signals:
 
 
protected:
    void keyPressEvent(QKeyEvent *event);
 
private:
    unsigned int index;                     // индекс текущего элемента случайного слова в векторе
    unsigned int random_index;              // сгенерированный рандомный индекс случайного слова в векторе
 
    unsigned int count_of_mistakes;         // кол-во ошибок , которое будет записываться в главное окно в соответсвующее поле
    unsigned int count_of_words;
    unsigned int local_mistakes;
 
    unsigned int exp;                       // общее кол-во опыта за все введенные слова
 
    Ui::MainWindow *ui;                     // указатель на главное окно. через него будет происходить обращение ко всем полям формы
    std::vector<QString> words;             // объект вектор (аналог массива), который будет содержать все слова для ввода в тренажёре
    TimerLoop *tl;
    std::multimap<int, QChar> simbols;      // карта соответствия кода нажатой клавиши с символом, который ей соответсвует
//  QThread *thread;
};
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    index(0),
    random_index(0),
    count_of_mistakes(0),
    local_mistakes(0),
    exp(0),
    count_of_words(0)
{
    ui->setupUi(this);
 
 
    tl = new TimerLoop(); - timer loop будет находится во втором потоке программы
 
 
 .........
}
 
void MainWindow::get_clock(int count)
{
    ui->label_timer->clear();
    ui->label_timer->setText(QString::number(count));
}
А это сам TimerLoop:

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
class MainWindow;
 
class TimerLoop : public QObject
{
    Q_OBJECT
public:
    explicit TimerLoop(QObject *parent = 0);
    ~TimerLoop() = default;
 
signals:
    void send_clock(int count);
 
public slots:
 
 
private:
    unsigned int count;
};
 
TimerLoop::TimerLoop(QObject *parent) : QObject(parent)
{
    count = 5;
    connect(this, SIGNAL(send_clock(int)), this, SLOT(get_clock(int))); // не знаю что указывать в предпоследнем аргументе функции connect, т.к. из этого класса нет доступа к главному окну
 
    emit send_clock(12);  // тестовая отправка, не сработала
}
Как лучше всего это сделать и не будет ли обработка сигналов каждую секунду сильно тормозить выполнение главного потока?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.04.2021, 19:10
Ответы с готовыми решениями:

Выбор между абстрактным классом, интерфейсом и простым классом
Здравствуйте. Помогите определиться, что следует выбрать в следующей ситуации, а главное почему следует выбирать именно это. ...

Организовать связь между собственным классом и классом SpriteABC
Здравствуйте. Подскажите, пожалуйста, как можно было бы организовать связь(?) между собственным классом и классом SpriteABC? Или...

Как соединить сигнал от формы с классом
Здравствуйте, не могу соединить сигнал от формы с внешним классом. Задача простая - передать параметры элементов из формы (текст, индексы и...

8
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.04.2021, 19:36
Снаружи делай connect, там где создаёшь объект. После того, как свяжешь с потоком.
0
фрилансер
 Аватар для Алексей1153
6447 / 5643 / 1128
Регистрация: 11.10.2019
Сообщений: 15,019
27.04.2021, 19:39
Цитата Сообщение от berkut234 Посмотреть сообщение
tl = new TimerLoop(); - timer loop будет находится во втором потоке программы
я так понимаю, будет вызов moveToThread?

если да, то тут нужно указать флаг Qt::QueuedConnection
Цитата Сообщение от berkut234 Посмотреть сообщение
connect(this, SIGNAL(send_clock(int)), this, SLOT(get_clock(int)));
Цитата Сообщение от berkut234 Посмотреть сообщение
не будет ли обработка сигналов каждую секунду сильно тормозить выполнение главного потока
нет, не будет. Но при условии, что в слоте ничего долгого не выполняется
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.04.2021, 19:40
Цитата Сообщение от Алексей1153 Посмотреть сообщение
нужно указать флаг Qt::QueuedConnection
Только если connect до moveToThread(). А после оно само должно быть queued.
0
фрилансер
 Аватар для Алексей1153
6447 / 5643 / 1128
Регистрация: 11.10.2019
Сообщений: 15,019
27.04.2021, 19:43
nmcf, у него этот коннект - в конструкторе, а объект будет перемещён позже

в любом случае, если заранее известно, что это будет другой поток, то не нужно полагаться на автоматику, а явно указывать
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.04.2021, 19:48
У него он в неправильном месте.
0
1 / 1 / 0
Регистрация: 20.09.2017
Сообщений: 134
27.04.2021, 20:40  [ТС]
Цитата Сообщение от Алексей1153 Посмотреть сообщение
нет, не будет. Но при условии, что в слоте ничего долгого не выполняется
Нет, там всего изменение текста виджета отображения таймера на значение после декремента.
Да, выполнение цикла отсчёта таймера от 60 до 0 будет в другом потоке. Буду использовать moveToThread(). Что касается флага, о котором вы говорили выше. Как его правильно подключить чтобы всё корректно работало?

Цитата Сообщение от nmcf Посмотреть сообщение
Снаружи делай connect, там где создаёшь объект. После того, как свяжешь с потоком.
Ок, передам в конструкторе главного окна объект TimerLoop, а затем в этом же конструкторе задам все connect-ы. Только что касается флага, о котором говорили выше? Куда его нужно задавать?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
27.04.2021, 22:02
Да не нужен он, если последовательность верна. Это флаг функции connect().
0
1 / 1 / 0
Регистрация: 20.09.2017
Сообщений: 134
27.04.2021, 22:34  [ТС]
Всем кто отписался огромное спасибо. Довёл всё до ума. Тема неактуальна
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
27.04.2021, 22:34
Помогаю со студенческими работами здесь

Очистка потока классом clearfix
Чтобы блок не схлопывался, внутри которого float блоки, один из способов, использование класса clearfix. .clearfix:after{ content:...

Использование классом объектов другого класса
Допустим есть два класса, назовём их First и Second, которые используют друг друга. Объявления классов в заголовочных файлах, определения...

Не удается воспользоваться классом из другого проекта
У меня по заданию курсач нужно сделать с помощью mc++. У меня есть три проекта: Приложение в ООП стиле То же самое приложение...

Наследование между шаблоном и классом
Очень простоя идея 1. Я хочу реализовать наследование между тимплейтом ARRAY и классом PointArray 2. Тимплеей ARRAY родитель 3....

Разница между структурой и классом
Подскажите почему при вызове метода переменная структуры change не изменяет свое изначально заданное значение на новое, в отличии от...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и напряжениями. Надо найти токи в ветвях. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и решает её. Последовательность действий:. . .
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru