Переключение на Главную Страницу Страницы: 1 ОтправитьПечать
Обычная тема Создание компонент (число прочтений - 3702 )
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Создание компонент
20. Мая 2009 :: 09:26
Печать  
Доброе вермя суток!
У меня есть некоторое количество классов, экземпляр каждого из них я создаю в 1С используя СоздатьОбъект. Если мне в каждом из этих классов нужен диспатч 1С, то получается я должен каждый раз использовать ПодключитьВнешнююКомпоненту, т.е. если у меня в компоненте пять классов, то нужно пять раз вызывать этот метод? Можно ли как-нибудь обойтись одним вызовом, а то как-то некрасиво получается? Я тут пытался похимичить, например создавая один главный класс, который будет подгружаться с использованием ПодключитьВнешнююКомпоненту, а остальные классы создал подчиненными этому, но что-то не получилось ничего у меня, точнее, диспатч 1С я могу получить во всех подчиненных классах, но возникает проблема с зависанием процесса-призрака в памяти после выгрузки 1с.
Если работать только с одним классом, то проблем с призраками нет, просто непосредственно перед возвратом объекта в 1С я грохаю диспатч, например, я возвращаю в 1С объект типа ТаблицаЗначений:

Marshal.Release(Marshal.GetIDispatchForObject(obj1C));   //грохаю диспатч
GC.Collect();
GC.WaitForPendingFinalizers();

return TableData; //объект типа ТаблицаЗначений

Когда же я использую диспатч в подчиненном классе, то как я ни пытался грохнуть ссылки, ничего не выходило и метод Done()  родительского класса не срабатывал при выгрузке 1С.
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание компонент
Ответ #1 - 20. Мая 2009 :: 09:48
Печать  
А кто обещал, что будет легко?  Улыбка Если ссылки считать не хочешь, используй vkloader от orefkov - зависать не будет..
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Создание компонент
Ответ #2 - 20. Мая 2009 :: 09:57
Печать  
Так, а что их считать, я ведь создаю одну при загрузке компоненты, а дальше использую одну и ту же ссылку. Или я чего-то не понял? Озадачен
  
Наверх
 
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Создание компонент
Ответ #3 - 20. Мая 2009 :: 10:51
Печать  
В общем, решил я проблему, правда немного корявенько, как мне кажется, надеюсь здешние спецы подскажут прав я или нет.
Короче говоря, когда я в подчиненном классе перед возвратом в 1С объекта пытался грохнуть диспатч, то выходила ругань, т.к. получалось, что в тот момент когда 1с получает, например таблицу значений и пытается с ней работать, то ссылка на эту таблицу грохается и выпадает ошибка. Фиг поймешь, если я в основном классе (в смысле в том, который загрузил используя ПодключитьВнешнююКомпоненту) использую тот же способ, то 1С не ругается.

Сдеал я так: перед возвратом объекта в 1С я создаю отдельный поток, в котором запускаю цикл while (obj1C != null), а в нем используя конструкцию try, пытаюсь грохнуть диспатч. Пока 1С использует полученный объект, попытка удалить диспатч будет вызывать исключение и цикл будет продолжать работать, как только объект освободится, диспатч грохнется.

Вообще этот вариант хоть и рабочий, но все же мне тут не все понятно. Например, в 1С я пишу:
Код
Выбрать все
ПодключитьВнешнююКомпоненту("ORCAS"); //осн. класс

//далее работаю с подчиненным, который дергает диспатч из родительского
crappity smackER = СоздатьОбъект("crappity smackER");
Т = crappity smackER.GetTableWithData(); //получаю таблицу значений с данными
Т.ВыбратьСтроки();
Пока Т.ПолучитьСтроку() = 1 Цикл
     Сообщить(Т.Элемент.Наименование);
КонецЦикла;
 


Ну так вот, когда я грохал диспатч перед возвратом объекта в 1с, на строке "Т.ВыбратьСтроки();" выпадала ошибка " mscorlib: Value cannot be null.". Но когда я грохаю диспатч уже после окончания цикла, а потом снова запускаю код чтения таблицы значений в цикле (например, из другой процедуры), то ошибки не вылетают.

Я собственно спросить хотел, не слишком ли затратен для ресурсов системы такой способ?
  
Наверх
 
IP записан
 
berezdetsky
1c++ power user
Отсутствует


barba non facit sisadminum

Сообщений: 1986
Местоположение: Москва
Зарегистрирован: 19. Мая 2006
Пол: Мужской
Re: Создание компонент
Ответ #4 - 20. Мая 2009 :: 11:11
Печать  
Ужас По крайней мере, понятно, почему у тебя Init не вызывался.
Стесняюсь спросить - ты "Технологию создания" внимательно читал? Круглые глаза
  

пароль как коньяк, чем больше звездочек, тем лучше
Наверх
IP записан
 
DrunkProgrammer
Full Member
***
Отсутствует


I Love YaBB 2!

Сообщений: 128
Зарегистрирован: 28. Декабря 2007
Re: Создание компонент
Ответ #5 - 20. Мая 2009 :: 11:14
Печать  
Init() не вызывался, когда я использовал ЗагрузитьВнешнююКомпоненту, а что именно ты понял?
  
Наверх
 
IP записан
 
Переключение на Главную Страницу Страницы: 1
ОтправитьПечать