Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Объект из bpl в потоке

8
19 сентября 2012 года
mfender
3.5K / / 15.06.2005
Здравия желаю, уважаемые!
Голова пухнет уже.
Дано:
  1. В package.bpl есть некий TPersistent.
  2. Требуется создать его объект в потоке.
  3. Без потоков он создаётся и отлично работает.
  4. Так же без проблем он создаётся и работает под отладкой. То есть трассировка и логи показывают, что всё нормально происходит.
  5. При этом, под отладкой он работает только если поставить брекпоинт на TPersistentClass.Create или до него и пошагово всё посмотреть.
  6. В run-time он просто не создаётся, exception такой: Canvas does not allow drawing


Код:
HP := LoadPackage(pName);
  if HP > 0 then
  begin
    gClass := TgClass(GetClass(bla-bla));
    if Assigned(gClass) then
    begin
      try
        P := gClass.Create(Application);      
        SetEvent(P, 'OnError', Form1, 'ErrorMsg');
        SetEvent(P, 'OnSuccess', Form1, 'AccessMsg');
        SetObjectProp(P, 'Ini', PluginIni);
        if Assigned(P) then
        PAddr := P.MethodAddress('DoBlaBla');
                if PAddr <> nil then
                  begin
                    M.Code := PAddr;
                    M.Data := Form1;
                    TDoBlBla(M);
                  end;
      except
        on E: Exception do
          Form1.ErrorMsg(Self,
            Format('%s. Do not create %s', [E.Message, pName]));
      end;
Вот этот самый P создаётся при дебаге пошаговом и отрабатывает свой метод TDoBlBla(M), а иначе не желает хоть стреляйся, вываливается в except.
Что может быть причиной такого затейливого поведения?
1
19 сентября 2012 года
kot_
7.3K / / 20.01.2000
А разве наследники TPersistent является threadsafe?
8
19 сентября 2012 года
mfender
3.5K / / 15.06.2005
Ну там на самом деле наследыш TForm лежит. TPersistent я указал как самый верхний, который можно указать для RegisterClass.
8
19 сентября 2012 года
mfender
3.5K / / 15.06.2005
Во ещё обнаружилось что: срабатывает, но как-то случайно и иногда. Примерно один раз из четырёх-пяти ошибочных. мистика какая-то!
1
19 сентября 2012 года
kot_
7.3K / / 20.01.2000
Цитата: mfender
Ну там на самом деле наследыш TForm лежит. TPersistent я указал как самый верхний, который можно указать для RegisterClass.


так какая разница - это понятно что объект самого класса создавать нельзя - но сам факт - разве VCL-компоненты стали потокобезопасны?

10
20 сентября 2012 года
Freeman
3.2K / / 06.03.2004
По-моему, вот этот блок нужно обернуть в Syncronize, потому как общается с Application, созданным в другом потоке:

Код:
P := gClass.Create(Application);      
         SetEvent(P, 'OnError', Form1, 'ErrorMsg');
         SetEvent(P, 'OnSuccess', Form1, 'AccessMsg');
         SetObjectProp(P, 'Ini', PluginIni);
         if Assigned(P) then
         PAddr := P.MethodAddress('DoBlaBla');
                 if PAddr <> nil then
                   begin
                     M.Code := PAddr;
                     M.Data := Form1;
                     TDoBlBla(M);
                   end;
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог