Главная страница
    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.065 c
2-1267975056
berliod
2010-03-07 18:17
2010.08.27
Манифест


3-1233731200
Mike Kouzmine
2009-02-04 10:06
2010.08.27
Не выполняется селект в хранимой процедуре


2-1273817025
stas
2010-05-14 10:03
2010.08.27
idTcpServer/idTcpClient


15-1264368629
Юрий
2010-01-25 00:30
2010.08.27
С днем рождения ! 25 января 2010 понедельник


3-1241656611
Раиса
2009-05-07 04:36
2010.08.27
ADO+dbf - как будут называться функции в select





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