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

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

Страниц: 1 [2]   Вниз
  Печать  
Автор Тема: какой виртуальный метод вызывается после передачи сигнала?  (Прочитано 9911 раз)
Kolobok
Гость
« Ответ #15 : Апрель 29, 2010, 20:30 »

Сам этот принцип - безсмысленное дублирование соединений. Второе соединение для возможной обработки ошибки.

Это не дублирование. Первый сигнал посылается для обработки данных. Второй - для проверки результата.

Элементарно можно промахнуться:
- забыть сделать 2-е соединение, когда известно что в первом сединении слот может сгенерить ошибку;
- забыть добавить 2-е соединение, ко всем 1-м, во всех модулях, когда 1-й слот был изменен так что стал генерить ошибку.
[/quote]

Если так рассуждать, то можно и первый коннект забыть. Или забыть парочку объектов создать. Или ту самую библиотеку подключить.Улыбающийся
Записан
spectre71
Гость
« Ответ #16 : Апрель 29, 2010, 21:01 »

Сам этот принцип - безсмысленное дублирование соединений. Второе соединение для возможной обработки ошибки.

Это не дублирование. Первый сигнал посылается для обработки данных. Второй - для проверки результата.

Элементарно можно промахнуться:
- забыть сделать 2-е соединение, когда известно что в первом сединении слот может сгенерить ошибку;
- забыть добавить 2-е соединение, ко всем 1-м, во всех модулях, когда 1-й слот был изменен так что стал генерить ошибку.

Если так рассуждать, то можно и первый коннект забыть. Или забыть парочку объектов создать. Или ту самую библиотеку подключить.Улыбающийся

По поводу забыть первый коннект и подобное - оно безопасно, поскольку быстро поймаем ошибку. А вот парный - когда еще вылезет проблема.

Все зависит от опыта, в том числе применяемые нами модели.
Записан
SASA
Гость
« Ответ #17 : Апрель 30, 2010, 09:51 »

Я б вообще изменил способ генерации ошибок.
Вместо присваивания чего-либо в глобальную переменную надо вызывать функцию (испускать сигнал). Т.е. каждый объект должен знать как сообщить об ошибке.
Большой плюс этого подхода в том, что можно легко добавить информацию об ошибке. У меня эта функция имеет 4 параметра - что произошло, где, подробная инфа, критичность.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #18 : Апрель 30, 2010, 13:00 »

Цитировать
1) Чем тебе не нравятся предложенные варианты. Поясни.

тем, что в них приходится над штатными средствами Qt морочить еще надстройку, и не забывать ее использовать

Цитировать
2) Уточни что за обработка ошибок, в каких случаях, ...

библиотека написана на С, там просто устанавливается код ошибки, и даже не всегда возвращается false, то есть, надо после вызова функции проверять глобальную переменную на 0, надстройка над этой библиотекой написана на С++, и с Qt никак не связана, дополнительные функции просто также устанавливают код ошибки в этой же переменной - поэтому самое последнее предложение высылать сигнал не проходит в принципе

слоты - это простые короткие переходники, которые получают сигналы и вызывают функции библиотеки или надстройки над ней

среднее предложение, высылать сигнал сразу после высылки основного тоже не годится, потому как подавляющее большинство сигналов высылаются виджетами, созданными в QtDesigner, и кроме этого, сигналов гораздо больше, чем слотов - поэтому более кошерно сделать простое макро типа

Код:
#define returnSlot {GloballErrorMessage();return;}

где глобальная функция GloballErrorMessage() проверяет наличие кода ошибки, если он есть, выдает сообщение, и сбрасывает код в 0 - и использовать в конце каждого слота этот макрос вместо return - единственный минус тут - не забыть, что надо писать не return - хотя это конечно тоже хак...

но тут другой момент... вроде бы получается перевести все слоты в один объект, наследующий QMainWindow, а там вроде есть подходящий обработчик
Записан

2^7-1 == 127, задумайтесь...
ритт
Гость
« Ответ #19 : Май 01, 2010, 19:16 »

я бы написал удобный thin-wrapper для этой либы и не замусоривал бы код приложения сторонними вызовами...
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #20 : Май 02, 2010, 12:47 »

Вряд ли Вы отделаетесь макросом, обычно надо сохранить "контекст ошибки" чтобы потом заняться ее печатью (а может и восстановлением). Напр у меня ф-ция SetError принимает 4 параметра

- класс ошибки
- код ошибки
- N (контекстно-зависимое, напр размер блока памяти который не удалось распределить)
- ID файла при обработке которого произошла ошибка (или 0)

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


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