Вверх ↑
Ответов: 4622
Рейтинг: 746
#1: 2018-05-18 11:20:14 ЛС | профиль | цитата
Galkov писал(а):
Активизация клиент-серверных связей из деструктора.
Не только. Ещё "Активизация клиент-серверных связей" из пераллельного потока (Thread, MMTimer, возможно, BASS и другие компоненты, где есть потоки), в случае, если поток не останавливается перед закрытием программы (а узнать о закрытии внутри кода нельзя; только если пользователь по событию закрытия формы сам остановит работу компонента, если в нём такая возможность предусмотрена).

Кроме того, не факт, что у нас во всех клиентах-менеджерах в деструкторах это предотвращено. Например, в hiMST_UseEditCtrl.pas есть
sControl.AttachProc(WndProcTabGrid);

Если не ошибаюсь, то при уничтожении менеджера перед клиентом в WndProcTabGrid клиента прилетит сообщение WM_DESTROY. В данном случае ошибки, вероятно, не будет так как и менеджер ещё существует и в клиенте сообщение WM_DESTROY никак не обрабатывается, но налицо "Активизация клиент-серверных связей из деструктора".

И да, если в процессе уничтожения менеджеры сделают клиетам что-то типа Client.NotifyDestroy(Self), а клиенты в этом методе подчистят всю работу с менеджером (без задействования внешних точек), проблем не вижу. При этом, клиент в своем Destroy() уже точно будет знать существует ли его менеджер ещё или нет, и в случае существования тоже чистить свои следы в менеджере.
карма: 26

0
Редактировалось 2 раз(а), последний 2018-05-18 12:39:53