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

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

Страниц: 1 ... 6 7 [8]   Вниз
  Печать  
Автор Тема: Частный случай механизма сигнал-слот  (Прочитано 73741 раз)
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #105 : Апрель 26, 2012, 17:59 »

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

Код
C++ (Qt)
class A
{
public:
   signal<void> TellSmth;
};
 
class B : public SlotObject
{
public:
   signal<void> TellSmth;
 
   B()
   {
        a.TellSmth.connect(&TellSmth);
   }
private:
   A a;
}
 

Прошу прощения за typedef SlotObject, просто исходное название класса мне мало что говорило. : )
Удивление вызвало, что не нужно указывать ни объект получателя(this), ни тип класса слота. Похоже, я не очень понимаю как работают указатели на функции и указатели на функции-члены класса. Всегда был уверен, что они не зависит от типа контекста и никакое приведение одних к другим невозможно.

Вы же соединяете сигнал с сигналом..При чём здесь мембер/не мембер функции?
Вообще, какое то странное использование сигнально-слотового механизма.. Почему бы просто не вызывать сигнал TellSmth, объекта класса B?

Да, с мембер/не мембер функциями там всё нормально, signal знает всё что нужно о слотах и всё сделает правильно при вызове)

А в чём вопрос, я не понял?
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
whitecemetery
Гость
« Ответ #106 : Май 15, 2012, 11:21 »

Цитировать
Почему бы просто не вызывать сигнал TellSmth, объекта класса B?
Инкапсуляция, не?  Подмигивающий
Почему я как пользователь должен знать, что внутри B есть A? Я знаю только про B.
Вопрос в синтаксисе языка, видимо. Видно у меня тут большое непонимание просто. Надо разбираться.


Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #107 : Май 15, 2012, 20:04 »

Цитировать
Почему бы просто не вызывать сигнал TellSmth, объекта класса B?
Инкапсуляция, не?  Подмигивающий
Почему я как пользователь должен знать, что внутри B есть A? Я знаю только про B.
Вопрос в синтаксисе языка, видимо. Видно у меня тут большое непонимание просто. Надо разбираться.
Я просто не совсем понимаю в чём проблема?
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
whitecemetery
Гость
« Ответ #108 : Февраль 15, 2013, 08:43 »

Привет!
Понадобилось ввести потоковую безопасность при вызове signal->operator() (у меня виджеты начинают перерисовыватся, еще не дорисовавшись, потому что их можно с тачскрина и клавиатуры контролировать, которые в разных потоках Улыбающийся), вот сейчас буду разбираться.
Библиотеку по-прежнему нужно оставить кросс-платформенной, поэтому думаю ввести просто абстрактный класс мьютекса, реализацию которого отдать конкретным платформам.
А библиотека будет по какому-то методу этот конкретный класс вытаскивать. Если возникнут вопросы, отпишусь. Советы приветствуются. Улыбающийся
Если получившийся код мне понравится, скину сюда.
А вообще, спасибо еще раз за библиотеку.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #109 : Февраль 15, 2013, 11:01 »

Привет!
Понадобилось ввести потоковую безопасность при вызове signal->operator() (у меня виджеты начинают перерисовыватся, еще не дорисовавшись, потому что их можно с тачскрина и клавиатуры контролировать, которые в разных потоках Улыбающийся), вот сейчас буду разбираться.
Библиотеку по-прежнему нужно оставить кросс-платформенной, поэтому думаю ввести просто абстрактный класс мьютекса, реализацию которого отдать конкретным платформам.
А библиотека будет по какому-то методу этот конкретный класс вытаскивать. Если возникнут вопросы, отпишусь. Советы приветствуются. Улыбающийся
Если получившийся код мне понравится, скину сюда.
А вообще, спасибо еще раз за библиотеку.

Сделать её потокобезопасной, это будет не просто.. Как вариант можно воспользоваться boost::signals2

И кстати, в С++11 есть Thread support library: http://en.cppreference.com/w/cpp/thread
Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
whitecemetery
Гость
« Ответ #110 : Февраль 15, 2013, 13:56 »

Спасибо, я знаю.
К несчастью, компилятор микроконтроллера, под который я пишу, не поддерживает C++11. Там вообще по умолчанию все библиотеки на C и приходится обертки писать с указателями void * на члены класса порой. )
А буст, боюсь, съест всю мою память. К тому же у меня есть личная нетерпимость буста за отвратительный интерфейс(опять же, на мой личный взгляд) и соответствующее этому низкое желание в еще каких-то его либах разбираться.
Записан
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #111 : Март 21, 2013, 01:45 »

Решил тут ради интереса освоить Variadic template (полезная фича, надо заметить) и в процессе обобщил libssc.
Теперь сигнально слотовое соединение может содержать произвольное число параметров.
(при этом объём кода libssc уменьшился более чем в три раза)

пример использования:
Код
C++ (Qt)
#include <iostream>
#include <string>
#include "signal_slot.h"
 
void some_func(int a, float f, const std::string &str, double &x) {
   std::cout << "x = " << x << std::endl;
   std::cout << "a = " << a << " f = " << f << " str = " << str << std::endl;
   x += 123.456;
   std::cout << "x = " << x << std::endl;
}
 
class object : public ssc::trackable
{
public:
 
   void print(const std::string &text) const { std::cout << text << std::endl; }
 
   int sum(int x, int y, int z) const {
       int s = x + y + z;
       std::cout << "sum = " << s << std::endl;
       return s;
   }
 
};
 
 
int main()
{
   object obj;
 
   ssc::signal<const std::string &> sig1;
   sig1.connect(&obj, &object::print);
 
   ssc::signal<long, float, int> sig3;
   sig3.connect(&obj, &object::sum);
 
   ssc::signal<int, double, const std::string &, double&> sig4;
   sig4.connect(some_func);
 
   sig1("hello word!");
   sig3(1, 3.14, 2);
 
   double x = 0.0;
   sig4(1, 3.14, "hello word!", x);
 
   return 0;
}
 

проект приатачен.


 
« Последнее редактирование: Март 25, 2013, 12:16 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
m_ax
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2095



Просмотр профиля
« Ответ #112 : Март 27, 2013, 18:03 »

Залил проект на gitorius:
https://www.gitorious.org/lightssp
« Последнее редактирование: Март 29, 2013, 19:54 от m_ax » Записан

Над водой луна двурога. Сяду выпью за Ван Гога. Хорошо, что кот не пьет, Он и так меня поймет..

Arch Linux Plasma 5
Страниц: 1 ... 6 7 [8]   Вверх
  Печать  
 
Перейти в:  


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