boost::singnal cancel invocation
От: Аноним  
Дата: 01.05.08 11:23
Оценка:
Нужно прекратить дальнейшее выполнение слотов по коду возврата текущей функции-слота. Прервать сигналирование.
Как это осуществить, подскажите.
Re: boost::singnal cancel invocation
От: 0xDEADBEEF Ниоткуда  
Дата: 02.05.08 11:18
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Нужно прекратить дальнейшее выполнение слотов по коду возврата текущей функции-слота. Прервать сигналирование.

А>Как это осуществить, подскажите.
Бросить исключение из слота и поймать его на выходе из сигнала?
__________
16.There is no cause so right that one cannot find a fool following it.
Re[2]: boost::singnal cancel invocation
От: Аноним  
Дата: 02.05.08 12:27
Оценка:
Здравствуйте, 0xDEADBEEF, Вы писали:

DEA>Здравствуйте, Аноним, Вы писали:


А>>Нужно прекратить дальнейшее выполнение слотов по коду возврата текущей функции-слота. Прервать сигналирование.

А>>Как это осуществить, подскажите.
DEA>Бросить исключение из слота и поймать его на выходе из сигнала?
И каждый клиент должен включать выброс исключения в свой код? Не подходит.
Re[3]: boost::singnal cancel invocation
От: 0xDEADBEEF Ниоткуда  
Дата: 02.05.08 12:44
Оценка:
Здравствуйте, Аноним, Вы писали:

А>>>Нужно прекратить дальнейшее выполнение слотов по коду возврата текущей функции-слота. Прервать сигналирование.

А>>>Как это осуществить, подскажите.
DEA>>Бросить исключение из слота и поймать его на выходе из сигнала?
А>И каждый клиент должен включать выброс исключения в свой код? Не подходит.
...Это если думать спинным мозгом. А если думать мозгом головным, то подходит.

Пример:
//пользователь вызывает только эту функцию для вызова сигнала.
void invoke_signal(args...)
{
   try {
       my_signal(args...);//my_signal недоступен из пользовательского кода
   } catch(cancel_signal) {
       //если мы здесь, кто-то обломил наш сигнал
   }
}
__________
16.There is no cause so right that one cannot find a fool following it.
Re: boost::singnal cancel invocation
От: Elifant  
Дата: 06.05.08 17:47
Оценка: 29 (1)
Здравствуйте, Аноним, Вы писали:

А>Нужно прекратить дальнейшее выполнение слотов по коду возврата текущей функции-слота. Прервать сигналирование.

А>Как это осуществить, подскажите.

Использовать свой combiner:

// Execute signal handlers until one of them returns 'true'.
// Result is 'true' if some handler returns 'true' and 'false' otherwise.
// If there are no handlers, result is 'false'.
template<typename T>
struct until_true {
  typedef bool result_type;

  template <typename InputIterator>
  bool operator()(InputIterator first, InputIterator last) const {
    while (first != last) {
      if (*first == true)
        return true;
      ++first;
    }
    return false;
  }
};

boost::signal<bool (int), until_true> signal;
Re[2]: boost::singnal cancel invocation
От: Аноним  
Дата: 06.05.08 19:26
Оценка:
Здравствуйте, Elifant, Вы писали:

E>Здравствуйте, Аноним, Вы писали:


А>>Нужно прекратить дальнейшее выполнение слотов по коду возврата текущей функции-слота. Прервать сигналирование.

А>>Как это осуществить, подскажите.

E>Использовать свой combiner:


Это я уже собразил, спасибо. А теперь самое главное: как из комбайна достать параметры сигнала?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.