Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.08.27;
Скачать: CL | DM;

Вниз

Потоконебезопасность VCL   Найти похожие ветки 

 
Германн ©   (2010-01-19 01:26) [0]

Это не попытка "открыть закрытое" обсуждение. Но речь о той же проблеме, что и в топиках "ShowModal".
Логгирование прошло успешно. Получаю один неудачный вызов функции на примерно 15-20 удачных. Понял причину неудач (но ясности не получил).
Теперь вопрос (гипотетический и возможно глупый).
У меня есть библиотека ocx от производителя железа. Написанная скорее всего на VB. Я установил её в Дельфи через Import Component -> Import ActiveX Control. У установленного компонента есть "асинхронный" метод ХХХReadDoubleReq, который, как мне думается (и далее тоже мои домыслы), создаёт доппоток, в котором вызывается синхронный вариант того же метода. А после возврата из этого синхронного метода вызывается мой обработчик события данного компонента OnХХХReadDoubleConf. Причем вызывается в самом доппотоке.
А в моем обработчике могут быть обращения к визуальным компонентам  Дельфи.
1. Чем это мне может грозить?
2. Может ли такая хренотень не создавать проблем (без моего особого участия)?


 
vuk ©   (2010-01-19 01:43) [1]

Чтобы не строить домыслов, наверное надо как-то посмотреть, откуда приходит вызов в OnХХХReadDoubleConf.


> А в моем обработчике могут быть обращения к визуальным компонентам
>  Дельфи.

Лучше не надо. А если надо, то синхронизировать как-то и выполнять обращение к компонентам в контексте основного потока.


> 1. Чем это мне может грозить?

Если обращение будет происходить действительно из другого потока, то может быть что угодно. Рандом рулит. :)


> 2. Может ли такая хренотень не создавать проблем (без моего
> особого участия)?

Как повезет. Но зачем городить, как справедливо замечено, хренотень, которая может создавать проблемы?


 
Германн ©   (2010-01-19 01:51) [2]


> vuk ©   (19.01.10 01:43) [1]
>
> Чтобы не строить домыслов, наверное надо как-то посмотреть,
>  откуда приходит вызов в OnХХХReadDoubleConf.
>

Как посмотреть?

> Как повезет. Но зачем городить, как справедливо замечено,
>  хренотень, которая может создавать проблемы?
>

Горожу не я. Городит та фирма. Но упрекать её я пока не могу. Пока у меня нет доказательств. Есть только два моих примера использования. Один безпроблемный (визуальные компоненты не используются) и один "фифти-фифти" (визуальные компоненты используются).


 
vuk ©   (2010-01-19 01:58) [3]


> Как посмотреть?

Брейкпоинт в отладчике. Ну или тупо сравнить идентификатор текущего потока с идентификатором основного.


> Горожу не я.

Фирма как раз не городит. Если там всё действительно так, как описано, то все просто и логично. Огород начинается, когда идет обращение к компонентам заведомо потоконебезопасной VCL.


 
Германн ©   (2010-01-19 02:13) [4]


> vuk ©   (19.01.10 01:58) [3]
>
>
> > Как посмотреть?
>
> Брейкпоинт в отладчике. Ну или тупо сравнить идентификатор
> текущего потока с идентификатором основного.
>

Попробую завтра.
> Фирма как раз не городит. Если там всё действительно так,
>  как описано, то все просто и логично. Огород начинается,
>  когда идет обращение к компонентам заведомо потоконебезопасной
> VCL.
>

Т.е. если бы я работал на VB, то у меня не было бы проблем?


 
vuk ©   (2010-01-19 02:16) [5]


> Т.е. если бы я работал на VB, то у меня не было бы проблем?

Без понятия. Я не в курсе, что там с потокобезопасностью. Да и не в VB я проблем не вижу. Синхронизация - это не проблема.


 
Германн ©   (2010-01-19 02:26) [6]


> vuk ©   (19.01.10 02:16) [5]
>
>
> > Т.е. если бы я работал на VB, то у меня не было бы проблем?
>
>
> Без понятия. Я не в курсе, что там с потокобезопасностью.
>  Да и не в VB я проблем не вижу. Синхронизация - это не
> проблема.

Да? А как?


 
vuk ©   (2010-01-19 02:33) [7]


> Да? А как?

Да хоть PostMessage.


 
Германн ©   (2010-01-19 02:53) [8]


> vuk ©   (19.01.10 02:33) [7]
>
>
> > Да? А как?
>
> Да хоть PostMessage.

Хошь ты, Лёха, смейся, хошь нет, но я именно так и ушёл от данной проблемы.
Но "понимания" мне это не добавило.
А это значит что я "нифига ничего" не понял в самой сути проблемы.


 
Сергей М. ©   (2010-01-19 08:16) [9]


> Как посмотреть?


if GetCurrentThreadId = MainThreadId then
.. основной ..
else
.. дополнительный ..


 
Anatoly Podgoretsky ©   (2010-01-19 09:11) [10]

> Германн  (19.01.2010 01:26:00)  [0]

VB не пересекается с Дельфи


 
oxffff ©   (2010-01-19 09:16) [11]


>Германн ©   (19.01.10 01:26)  
> У установленного компонента есть "асинхронный" метод ХХХReadDoubleReq,
>  который, как мне думается (и далее тоже мои домыслы), создаёт
> доппоток, в котором вызывается синхронный вариант того же
> метода. А после возврата из этого синхронного метода вызывается
> мой обработчик события данного компонента OnХХХReadDoubleConf.
>  Причем вызывается в самом доппотоке.
> А в моем обработчике могут быть обращения к визуальным компонентам
>  Дельфи.
> 1. Чем это мне может грозить?
> 2. Может ли такая хренотень не создавать проблем (без моего
> особого участия)?


http://www.midnightbeach.com/jon/pubs/MsgWaits/MsgWaits.html
http://www.drbob42.com/uk-bug/hood-04.htm
http://delphi.about.com/od/kbthread/a/thread-gui.htm


 
vuk ©   (2010-01-19 11:23) [12]

to Германн ©   (19.01.10 02:53) [8]:

> Хошь ты, Лёха, смейся, хошь нет, но я именно так и ушёл
> от данной проблемы.
> Но "понимания" мне это не добавило.

А чего смеяться-то? Вполне нормальный способ решения вопросов с синхронизацией. А если что-то непонятно, так и надо спрашивать, что именно непонятно.


 
Дмитрий Белькевич   (2010-01-19 11:26) [13]

>Хошь ты, Лёха, смейся, хошь нет, но я именно так и ушёл от данной проблемы. Но "понимания" мне это не добавило.

Что не ясно? Из доп. потока лезешь к vcl"у. Начинаются проблемы. Обращение убрал - проблемы окончились. Вроде бы всё прозрачно.


 
Германн ©   (2010-01-19 18:26) [14]


> Сергей М. ©   (19.01.10 08:16) [9]
>
>
> > Как посмотреть?
>
>
> if GetCurrentThreadId = MainThreadId then
> .. основной ..

Говорит что основной. Значит я ошибся в своих домыслах.


 
Владислав ©   (2010-01-20 09:42) [15]


> Говорит что основной. Значит я ошибся в своих домыслах.

Судя по всему, проблема не в обращении к VCL из разных потоков, а в неверном предположении о последовательности вызовов методов/обработчиков событий. PostMessage помог обеспечить предполагаемую последовательность.



Страницы: 1 вся ветка

Текущий архив: 2010.08.27;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.044 c
15-1268861402
Юрий
2010-03-18 00:30
2010.08.27
С днем рождения ! 18 марта 2010 четверг


2-1271760916
Irisss
2010-04-20 14:55
2010.08.27
Панель иконок


2-1274637067
REX
2010-05-23 21:51
2010.08.27
Печать


15-1269450731
GDI+
2010-03-24 20:12
2010.08.27
Формула рассчета расстояния между двумя точками на сфероиде


2-1269016126
pavel_guzhanov
2010-03-19 19:28
2010.08.27
При сравнении содержимого двух TImage получаю AV