Форум: "Прочее";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];
ВнизПотоконебезопасность 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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.065 c