242 / 61 / 14
Регистрация: 05.04.2018
Сообщений: 947
Записей в блоге: 1
1

Множественный вызов метода после connect

13.01.2020, 14:21. Показов 1438. Ответов 14
Метки нет (Все метки)

Привет. Необходимо, чтобы слот вызвался лишь единожды, но, тк сигнал вызывается множество раз, то и слот будет вызван не один раз. А как сделать, чтобы слот отработал только один раз? (в этом слоте нельзя сделать дисконнект)
C++ (Qt)
1
2
3
4
connect(_model, &Model::finished, this, [=](){
    _model->getData(chooseID);
},
Qt::UniqueConnection);
думал, Qt::UniqueConnection поможет, но нет.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.01.2020, 14:21
Ответы с готовыми решениями:

Вызов метода после завершения потока
Здравствуйте. Есть вот такой простой пример: private void Work() { ...

Вызов родительского метода после BeginInvoke
Есть форма с гридом. Пользователь из нее может запустить довольно продолжительную хранимую...

Вызов метода сразу после загрузки окна
Мне нужно чтобы метод PrimaryData(); отработал сразу после инициализации окна. Можна ли это сделать...

Полиморфизм: вызов метода базового класса, переопределенного метода и нового метода
В базовом классе метод помечен как virtual. Насколько я понял из книги: override означает, что...

14
16 / 14 / 4
Регистрация: 21.11.2014
Сообщений: 318
13.01.2020, 14:50 2
Ну можно типа костыля сделать : внутри класса делаешь bool isProcessing и метод setProcessing(bool flag) в слоте проверку делаешь if(!isProcessing) return

Добавлено через 9 минут
Qt :: UniqueConnection не работает для лямбда-выражений, функций, не являющихся членами, и функторов; они применяются только для подключения к функциям-членам.
1
242 / 61 / 14
Регистрация: 05.04.2018
Сообщений: 947
Записей в блоге: 1
13.01.2020, 15:31  [ТС] 3
Цитата Сообщение от Nightwalker Посмотреть сообщение
Ну можно типа костыля сделать : внутри класса делаешь bool isProcessing и метод setProcessing(bool flag) в слоте проверку делаешь if(!isProcessing) return
не то
Цитата Сообщение от Nightwalker Посмотреть сообщение
Qt :: UniqueConnection не работает для лямбда-выражений, функций, не являющихся членами, и функторов; они применяются только для подключения к функциям-членам.
да, "наткнулся" после того, как эту тему создал. Но, используя старый способ коннекта Qt :: UniqueConnection всё-равно позволял вызов несколько раз один за другим слота, что-то в этом я не понимаю, хотя, доку прочел.
Получилось так:
C++ (Qt)
1
2
3
4
5
6
7
8
9
std::unique_ptr<QMetaObject::Connection> pconn{new QMetaObject::Connection};
QMetaObject::Connection &conn = *pconn;
conn = connect(_model, &Model::finished, this, [=](){
    _model->getData(chooseID);
});
 
connect(_model, &Model::dataReceived, [=](){
    disconnect(conn);
});
0
468 / 444 / 71
Регистрация: 29.05.2015
Сообщений: 2,905
13.01.2020, 16:12 4
C++ (Qt)
1
2
3
4
5
6
7
8
{
    static int cx = 0;
    if(cx++) return;
 
    ...
    тело слота
    ...
}
1
зомбяк
1533 / 1178 / 332
Регистрация: 14.05.2017
Сообщений: 3,824
13.01.2020, 17:38 5
alexu_007, а как же переполнение?
1
фрилансер
3016 / 2255 / 563
Регистрация: 11.10.2019
Сообщений: 6,686
13.01.2020, 23:55 6
Цитата Сообщение от TRam_ Посмотреть сообщение
а как же переполнение
C++
1
static uint64_t cx = 0;
Добавлено через 5 минут
а вообще, зачем счётчик, bool должно быть достаточно. Причём - снаружи лямбды
0
468 / 444 / 71
Регистрация: 29.05.2015
Сообщений: 2,905
14.01.2020, 02:19 7
Цитата Сообщение от TRam_ Посмотреть сообщение
alexu_007, а как же переполнение?
4 млрд, если считать количество вызовов слота по 1000 раз в секунду - то ресурс составляет 4 млн. секунд, это 46 дней. Потом программа крашится.
0
242 / 61 / 14
Регистрация: 05.04.2018
Сообщений: 947
Записей в блоге: 1
14.01.2020, 08:49  [ТС] 8
в последнем моем примере всё ок, работает. Счетчики и флаги не то, стараюсь избегать.
0
фрилансер
3016 / 2255 / 563
Регистрация: 11.10.2019
Сообщений: 6,686
14.01.2020, 08:57 9
Джон Кофи, я бы даже сказал, что если есть необходимость указать Qt::UniqueConnection для коннекта к лямбде, то это звоночек, что тут нужна не лямбда, а слот-функция. Тогда флаги и счётчики будут не нужны

зачем идти против ветра
0
242 / 61 / 14
Регистрация: 05.04.2018
Сообщений: 947
Записей в блоге: 1
14.01.2020, 09:01  [ТС] 10
Цитата Сообщение от Алексей1153 Посмотреть сообщение
слот-функция
дак пробовал, не заработало не знаю почему, я вообще не понимаю тогда зачем Qt::UniqueConnection, если не для использования в моем случае.
0
фрилансер
3016 / 2255 / 563
Регистрация: 11.10.2019
Сообщений: 6,686
14.01.2020, 09:10 11
Цитата Сообщение от Джон Кофи Посмотреть сообщение
дак пробовал, не заработало
покажи код
0
242 / 61 / 14
Регистрация: 05.04.2018
Сообщений: 947
Записей в блоге: 1
14.01.2020, 09:40  [ТС] 12
Цитата Сообщение от Алексей1153 Посмотреть сообщение
покажи код
изначально сигнал модели не передает никаких данных, а я беру int chooseID из той области, в которой коннект и объявлен.
C++ (Qt)
1
2
3
connect(_model, &Model::finished, this, [=](){
    _model->getData(chooseID);
});
тк мне нужно использовать oldstyle, то для передачи параметра мне нужно вызвать сигнал, который этот chooseID передаст? то есть сделать при получении сигнала &Model::finished еще один, который передаст chooseID.
В итоге получаем:
C++ (Qt)
1
2
connect(_model, &Model::finished, [=]() { this->signal(chooseID);});
connect(this, SIGNAL(signal(int)), SLOT(callGetData(int)), Qt::UniqueConnection);
callGetData() будет вызывать метод модели getData и передавать в него chooseID.
Ну и в итоге этот SLOT(callGetData(int)) попадает в "бесконечный вызов"
0
фрилансер
3016 / 2255 / 563
Регистрация: 11.10.2019
Сообщений: 6,686
14.01.2020, 10:30 13
"signal" - зарезервированное для Qt слово, его лучше не использовать

суть проблемы лично мне осталась не ясна. Покажи функцию (содержащую локальную переменную chooseID), в которой всё это делается
0
242 / 61 / 14
Регистрация: 05.04.2018
Сообщений: 947
Записей в блоге: 1
14.01.2020, 10:58  [ТС] 14
Цитата Сообщение от Алексей1153 Посмотреть сообщение
"signal" - зарезервированное для Qt слово, его лучше не использовать
это я "тут" так написал, у меня уже нет того кода, ветку спушил, удалил)
Цитата Сообщение от Алексей1153 Посмотреть сообщение
суть проблемы
слот вызывается бесконечно один за другим (сигнал &Model::finished эмитится много! раз), поэтому мне нужен был дисконнект после выполнения слота, чтобы этот слот вызывался только ОДИН раз.

Цитата Сообщение от Алексей1153 Посмотреть сообщение
Покажи функцию (содержащую локальную переменную chooseID), в которой всё это делается
C++ (Qt)
1
2
3
4
5
QModelIndexList chooseUsers = ui->_usersView->selectionModel()->selectedRows(Users::ID);
const int chooseUserID = chooseUsers.at(0).data().toInt();
 
connect(_model, &Model::finished, [=]() { this->signal(chooseID);});
connect(this, SIGNAL(signal(int)), SLOT(callGetData(int)), Qt::UniqueConnection);
0
фрилансер
3016 / 2255 / 563
Регистрация: 11.10.2019
Сообщений: 6,686
14.01.2020, 12:29 15
не вижу, где заполняется chooseID. Если имеется в виду chooseUserID , то

1)коннект сделать в конструкторе - всего один раз
C++ (Qt)
1
connect(_model, Model::finished, this, this->callGetData);
2) у слота callGetData убрать аргументы

3) сделать переменную int chooseUserID полем класса объекта this

4) слот callGetData будет использовать this->chooseUserID


кстати, сделай проверку, что chooseUsers не пустой, иначе вот тут может крашнуться

C++ (Qt)
1
chooseUsers.at(0)
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.01.2020, 12:29

Множественный рекурсивный вызов функции
hello world... еще раз)) то о что меня интересует вероятно есть в языке, я не знаю как эта штука...

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

IdHTTP метод WorkBegin множественный вызов
Создаю запрос в idHTTP, отправляю его в post режиме. Это всё происходит в отдельном потоке. Код :...

Вызов методов классов друг у друга (вызов метода из другого класса)
Есть несколько классов, которые могут вызывать методы (функции) друг у друга. Логика: класс1 имеет...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.