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

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

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Callback в виде слота  (Прочитано 9472 раз)
wenny
Гость
« : Июнь 15, 2016, 15:22 »

Доброго времени суток. Я привык работать с калбэками, но решил не быдлокодить в qt, коли там предусмотрели сигналы/слоты. Есть MainForm и RealClass. MainForm создает поток и закидывает в него метод RealClass'а, который ждет определенного события и выполняет действие. Так вот это действие (связанное вообще со сторонними классами) я по ряду причин хотел бы не намешивать в RealClass, у которого есть свои обязанности, а задавать из контроллера (MainForm). Калбэки выглядят уж больно грубо, решил ограничиться слотами. Вижу я это в виде передачи ссылки на реализованный слот. Вопрос: как это организовать? Я пытался стащить типизацию у connect, но буквально ничего не вышло. Спасибо.
Записан
Racheengel
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2679


Я работал с дискетам 5.25 :(


Просмотр профиля
« Ответ #1 : Июнь 15, 2016, 16:08 »

Передать в слот параметр колбэка с помощью поинтера или ссылки?
Записан

What is the 11 in the C++11? It’s the number of feet they glued to C++ trying to obtain a better octopus.

COVID не волк, в лес не уйдёт
wenny
Гость
« Ответ #2 : Июнь 15, 2016, 17:54 »

Передать в слот параметр колбэка с помощью поинтера или ссылки?
Не понял Вас.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #3 : Июнь 15, 2016, 18:02 »

Посмотрите на QtConcurrent или QRunnable. Но лучше на первое. Улыбающийся
Записан
wenny
Гость
« Ответ #4 : Июнь 15, 2016, 18:13 »

Как скомпилить такую конструкцию?:

Код
C++ (Qt)
Class *object

Компилер уверяет, что понятия не имеет о такой штуке как Class.
Записан
gil9red
Administrator
Джедай : наставник для всех
*****
Offline Offline

Сообщений: 1805



Просмотр профиля WWW
« Ответ #5 : Июнь 15, 2016, 19:45 »

Как скомпилить такую конструкцию?:

Код
C++ (Qt)
Class *object

Компилер уверяет, что понятия не имеет о такой штуке как Class.

Приинклудьте файл с таким классом или напишите сами.
Записан

wenny
Гость
« Ответ #6 : Июнь 15, 2016, 20:15 »

Такого файла, судя по всему, не существует. Это - царь-папа всех остальных классов, которые юзаются в QtConcurrent, и который я пытаюсь откуда-то взять.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #7 : Июнь 15, 2016, 20:49 »

Такого файла, судя по всему, не существует. Это - царь-папа всех остальных классов, которые юзаются в QtConcurrent, и который я пытаюсь откуда-то взять.
Я имел в виду не "смотреть как реализовано", а использовать сам QtConcurrent, что бы не надо было передавать callback.
Записан
wenny
Гость
« Ответ #8 : Июнь 15, 2016, 21:19 »

Совершенно не понял, каким образом смена способа запуска потока поможет логику перенести из RealClass в MainForm. Я лишь хочу, чтобы действие, выполняемое при определенных условиях, можно было передать в поток из MainForm, а не запихивать его в RealClass, который и является классом потока.
« Последнее редактирование: Июнь 15, 2016, 21:22 от wenny » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #9 : Июнь 15, 2016, 21:22 »

Совершенно не понял, каким образом смена способа запуска потока поможет логику перенести из RealClass в MainForm.
Вы сможете не ждать в потоке указатель на функцию для выполнения, а выполнять нужную функцию в потоке из пула, подготовленного QtConcurrent.
Записан
wenny
Гость
« Ответ #10 : Июнь 15, 2016, 21:24 »

Но указатель на эту функцию все равно ведь придется передавать.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #11 : Июнь 15, 2016, 21:27 »

Но указатель на эту функцию все равно ведь придется передавать.
Да. В тот момент, когда должны начаться вычисления.
Записан
wenny
Гость
« Ответ #12 : Июнь 15, 2016, 22:07 »

Я был бы Вам очень признателен за пример.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4349



Просмотр профиля
« Ответ #13 : Июнь 15, 2016, 22:16 »

Я был бы Вам очень признателен за пример.
В тот момент, когда вы планировали передавать callback-функцию для выполнения в поток, выполняете:
Код
C++ (Qt)
// Функция для выполнения в рабочем потоке
void process( QByteArray param )
{
   ...
}
 
void start()
{
   QByteArray data = ...
   QtConcurrent::run( func, data );
}
 

В документации есть примеры.
Записан
wenny
Гость
« Ответ #14 : Июнь 16, 2016, 13:27 »

В тот момент, когда вы планировали передавать callback-функцию для выполнения в поток, выполняете:
Код
C++ (Qt)
// Функция для выполнения в рабочем потоке
void process( QByteArray param )
{
   ...
}
 
void start()
{
   QByteArray data = ...
   QtConcurrent::run( func, data );
}
 

В документации есть примеры.
Насколько я понимаю, речь идет о передаче определенного параметра. А мне нужно передать ссылку на целый метод, определенный вообще в другом классе. Передать переменную я бы смог и без калбэка.
Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


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