![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Best practice в создании свойств-списков объектов в COM в многопо
Slym © (2007-12-07 12:43:00)Какой Best practice в создании свойств-списков объектов в COM в многопоточных приложениях?
Имеем многопоточное приложение и интерфейсы:
//// Член спискаciInternal/tmSingle
ITTestItem = interface(IDispatch)
['{350F0451-E8B4-42AE-A817-F83D112AD269}']
function Get_Data: Integer; safecall;
property Data: Integer read Get_Data;
end;
ITTestItemDisp = dispinterface
['{350F0451-E8B4-42AE-A817-F83D112AD269}']
property Data: Integer readonly dispid 201;
end;
//// Сам списокв нем же будет реализован и Enum ciInternal/tmSingle или ciInternal/tmApartment ?
ITTest = interface(IDispatch)
['{9C3922E1-A24C-417D-B052-EE2940AFD628}']
function Get_Items(Index: Integer): ITTestItem; safecall;
function Get_Count: Integer; safecall;
function Add: ITTestItem; safecall;
function _NewEnum: IUnknown; safecall;
property Items[Index: Integer]: ITTestItem read Get_Items;
property Count: Integer read Get_Count;
end;
ITTestDisp = dispinterface
['{9C3922E1-A24C-417D-B052-EE2940AFD628}']
property Items[Index: Integer]: ITTestItem readonly dispid 201;
property Count: Integer readonly dispid 202;
function Add: ITTestItem; dispid 203;
function _NewEnum: IUnknown; dispid -4;
end;
//// Объект-владелец спискаciSingleInstance/tmApartment
ITApp = interface(IDispatch)
['{426980CD-6720-4337-BE7A-82DA53343CBE}']
function Get_Test: ITTest; safecall;
property Test: ITTest read Get_Test;//То самое свойство
end;
1. Как реализовать возврат списка?
1.1. Создавать новую копию списка каждому запросившему, но при этом будут недоступны изменения в списке без запроса новой копии
1.2. Выдавать ссылку на имеющийся общий список, тогда как синхронизировать доступ к нему или оставить это для COM и играться настройками поточности апартмента (хотя в это с трудом верится)
2. О потоко безопасности члена списка позаботится COM есля я выставлю ТредМодельSingle?
Slym (2007-12-10 07:44:00) [1]Сергей М. © (07.12.07 13:27) [10]
Механизм ивентов и/или колбэков тоже не подходит в кач-ве альтернативы списочному взаимодействию между сервером и контроллерами ?
это тоже конечно будет, но для начала плацдарм подготовлю...
будет 2 типа евентов: OnCountChanged и OnItemChanged
Сергей М. © (07.12.07 13:15) [5]
Может енумератор удобней будет
Без этого тоже никуда... возможно к объекту будут из всяких VB(А) конектится
Slym (2007-12-10 07:37:00) [2]Определился... Будет выдаваться копия списка как ciInternal/tmSingle, + метод типа Refresh(Requery) для обновления
Вопрос №2
Как Вы реализуете освобождениеобектов при кросс-ссылочной организации взаимодействия объектов, т.е. разруливаете ситуацию с дедлоком освобождения ссылки 2х и более объектов друг на друга
Список хранит ссылки на итемы, но итемы тоже хранят ссылку на список
Сергей М. (2007-12-07 13:27:00) [3]
> мне какраз многопоточный синглетон в итоге нужен
Тогда АДО как пример неудачен.
> ядро будет объекты обновлять, клиенты объекты обрабатывать
Механизм ивентов и/или колбэков тоже не подходит в кач-ве альтернативы списочному взаимодействию между сервером и контроллерами ?
Slym (2007-12-07 13:23:00) [4]в идеале потом туда SQL присобачить какнить, типа как в WMI сделано "SELECT Item from core where item.ID=1" :) но это потом
Slym (2007-12-07 13:19:00) [5]Сергей М. © (07.12.07 13:17) [7]
а мне какраз многопоточный синглетон в итоге нужен со списком объектов, ядро будет объекты обновлять, клиенты объекты обрабатывать
Сергей М. (2007-12-07 13:17:00) [6]
> в ADO видел Lock/Unlock?
В один и тот же ADO-интерфейс ты и не сунешься из многих потоков одновременно - отлуп тут же получишь)
DrPass (2007-12-07 13:16:00) [7]
> Не проще ли ввести пару методов Lock/Unlock ?
Когда делаешь СОМ-объект, лучше по максимуму сделать его независимым от глупости/невнимательности разработчиков, которым он достанется. Поэтому я бы все-таки ограничился tmSingle
Сергей М. (2007-12-07 13:15:00) [8]С др.стороны, почему бы и не копия ?
Можно же реализовать все это по образу и подобию транзакционного механизма в серверах-версионниках ..
И так ли уж обязателен список ? Может енумератор удобней будет ?
Slym (2007-12-07 13:14:00) [9]хочется чтоб красиво было... в ADO видел Lock/Unlock? и это красиво (к ветке о красивости кода)
Сергей М. (2007-12-07 13:11:00) [10]
> Slym © (07.12.07 13:10) [2]
Не проще ли ввести пару методов Lock/Unlock ?
Slym (2007-12-07 13:10:00) [11]Сергей М. © (07.12.07 12:57) [1]
tmSingle
тогда толучается
Создавать новую копию списка каждому запросившему
Сергей М. (2007-12-07 12:57:00) [12]
> 2.
Ради упрощения алгоритма я бы положился на tmSingle