Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.03.05;
Скачать: CL | DM;

Вниз

Многопоточность и Property Page - не дружат?   Найти похожие ветки 

 
WondeRu ©   (2006-01-30 11:56) [0]

Здравствуйте!

уде 4 дня бьюсь с непонятным глюком:
1. Сделал COM-объект (tmFree)
2. добавил страницу свойств TPPage
3. добавил COM-объекту интерфейс ISpecifyPropertyPages
4. У вызывающего приложения "сделал" мультипоточность
begin
 CoInitFlags := COINIT_MULTITHREADED;
 Application.Initialize;
 Application.CreateForm(TForm1, Form1);
 Application.Run;
end.

5. пытаюсь показать эту страницу свойств

Результат:
Приложение виснет наглухо. Если убираю CoInitFlags := COINIT_MULTITHREADED, то все показывается замечательно, но, к сожалению, эта строчка критична!

 OleCheck(CoCreateInstance(
   AGUID,
   nil,
   CLSCTX_INPROC_SERVER,
   IPropertyPage,
   FPropertyPage));

 OleCheck(FPropertyPage.SetObjects(1, @ABase));
 OleCheck(FPropertyPage.SetPageSite(Self));
 OleCheck(FPropertyPage.GetPageInfo(PropPageInfo));
 OleCheck(FPropertyPage.Activate(Handle, Rect(0, 0, PropPageInfo.size.cx, PropPageInfo.size.cy), False));
 OleCheck(FPropertyPage.Show(SW_SHOW)); //Тут происходит зависание  


если убираем OleCheck(FPropertyPage.Activate(..., то страница свойств показывается и даже реагирует на действия, но в каком-то "левом" месте и не принадлежит форме.

какое посоветуете решение?


 
Digitman ©   (2006-01-30 12:13) [1]


> 1. Сделал COM-объект (tmFree)


Визуальные VCL-контролы в нем используешь ?
Если используешь, то придерживайся общего для любых VCL-приложений (будь то "обычное" приложение или СОМ-приложение) правил : обращения к VCL-контролам в контексте НЕосновного трэда процесса VCL-приложения недопустимы, ибо непотокобезопасны


 
WondeRu ©   (2006-01-30 13:22) [2]

Digitman ©   (30.01.06 12:13) [1]
удалил все VCL компоненты с TPropertyPage,удалил все лишние uses, но все-равно зависает(


 
Digitman ©   (2006-01-30 13:39) [3]


> WondeRu ©   (30.01.06 13:22) [2]


TPropertyPage - это наследник TCustomForm !

А форма - это точно такой же равноправный VCL-компонент, как и те которые ты удалил)


 
WondeRu ©   (2006-01-30 14:04) [4]

Digitman ©   (30.01.06 13:39) [3]
а как решать проблему? я хочу именно VCL использовать?


 
WondeRu ©   (2006-01-30 14:23) [5]

Заработало! пришлось изменить стандартную реализацию создания фабрики класса для PropertyPage, ибо по умолчанию она всегда создает объект с моделью tmSingle.

Я создал класс
 TActiveXPropertyPageFactory2 = class(TComObjectFactory)
 public
   constructor Create(ComServer: TComServerObject;
     PropertyPageClass: TPropertyPageClass; const ClassID: TGUID);
   function CreateComObject(const Controller: IUnknown): TComObject; override;
 end;

{ TActiveXPropertyPageFactory2 }

constructor TActiveXPropertyPageFactory2.Create(ComServer: TComServerObject;
 PropertyPageClass: TPropertyPageClass; const ClassID: TGUID);
begin
 inherited Create(ComServer, TComClass(PropertyPageClass), ClassID,
   "", Format("%s property page", [PropertyPageClass.ClassName]),
   ciMultiInstance, tmFree); // изменение выделено
end;

function TActiveXPropertyPageFactory2.CreateComObject(const Controller: IInterface): TComObject;
begin
 Result := TActiveXPropertyPage.CreateFromFactory(Self, Controller);
end;


а затем initialize переделал под свою реализацию
 TActiveXPropertyPageFactory2.Create(
   ComServer,
   TfpPAge,
   Class_fpPAge);



Страницы: 1 вся ветка

Текущий архив: 2006.03.05;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.066 c
15-1139542859
Бугага
2006-02-10 06:40
2006.03.05
Barry Manilow - Mandy


15-1139664410
Udaff
2006-02-11 16:26
2006.03.05
странное поведение стандартных диалогов


3-1136992846
franchuk
2006-01-11 18:20
2006.03.05
передача данных из БД в Microsoft Excel


2-1140240800
Начинающий5
2006-02-18 08:33
2006.03.05
Редактирование данных в запросе


2-1139805854
Officeman
2006-02-13 07:44
2006.03.05
randomize;