![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Многопоточность и 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-приложения недопустимы, ибо непотокобезопасны