Главная страница
    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.033 c
15-1139399785
gudzon1
2006-02-08 14:56
2006.03.05
Как отследить интернет-траффик?


3-1136982771
tytus
2006-01-11 15:32
2006.03.05
ХЕЛППП!!! BDEError Record/Key Deleted


2-1140275296
VAZMan
2006-02-18 18:08
2006.03.05
Регистрация пользователя


3-1136907278
alsov
2006-01-10 18:34
2006.03.05
XML с удаленного сервера как результат селекта


15-1139508569
ZeFiR
2006-02-09 21:09
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский