Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


WondeRu ©   (2006-01-30 11:56:00) 

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

уде 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(..., то страница свойств показывается и даже реагирует на действия, но в каком-то "левом" месте и не принадлежит форме.

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


WondeRu   (2006-01-30 14:23:00) [1]

Заработало! пришлось изменить стандартную реализацию создания фабрики класса для 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переделал под свою реализацию
 TActiveXPropertyPageFactory 2.Create(
   ComServer,
   TfpPAge,
   Class_fpPAge);


WondeRu   (2006-01-30 14:04:00) [2]

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


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


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


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

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


WondeRu   (2006-01-30 13:22:00) [4]

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


Digitman   (2006-01-30 12:13:00) [5]


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


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо