Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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.057 c
15-1274278041
Неокубинец
2010-05-19 18:07
2010.08.27
Неокуб своими руками? :)


2-1265830771
fford
2010-02-10 22:39
2010.08.27
копировать файл на расшареный ресурс


15-1265019220
12
2010-02-01 13:13
2010.08.27
О помощи. Забавно.


15-1268472470
Незнайка на Луне
2010-03-13 12:27
2010.08.27
Как организовать своё время)


2-1273322142
Родион
2010-05-08 16:35
2010.08.27
переписать из с++ в делфи





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