Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.03.05;
Скачать: [xml.tar.bz2];

Вниз

Многопоточность и 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.013 c
1-1138383597
guitarist
2006-01-27 20:39
2006.03.05
Компонент за пределами формы


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


1-1138621301
Ega23
2006-01-30 14:41
2006.03.05
Создание ShortCut в run-time


1-1138915522
guitarist
2006-02-03 00:25
2006.03.05
заполнение форм в IE


2-1140078068
VanDet
2006-02-16 11:21
2006.03.05
Здраствуйте помогите мне написать программу





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский