![]() |
|
|
Регистрация Восстановить пароль |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Пользователь
Регистрация: 06.06.2010
Сообщений: 79
|
![]()
Известно, что при использовании в приложении дополнительного потока "Методы и свойства объектов из библиотеки визуальных компонентов могут использоваться только в рамках вызова метода Synchronize ...".
Понятно, что изменение свойств визуального компонента должно выполнятся из того потока который им владеет, то есть из основного. А как насчёт чтения? Я думаю чтение просто в Execute без Synchronize. А вы как считаете? |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
Считаю что только из Synchronize. Кто знает, что в это время происходит с этим свойством в основном потоке
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#3 |
Пользователь
Регистрация: 06.06.2010
Сообщений: 79
|
![]()
Пока 1:1.
Если честно то я тоже склоняюсь к вашему мнению, но у меня есть желание чтобы это было не так. Например: Код:
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 08.04.2012
Сообщений: 3,229
|
![]()
Если чтение - атомарная операция, то, в принципе, можно не синхронизировать.
Только под "чтением" подразумевается не одна, все операции чтения, которые Вы можете сделать из неосновного потока. Т.е. если Вам нужно значение двух разных ячеек - это уже не атомарная операция. |
![]() |
![]() |
![]() |
#5 | |
Пользователь
Регистрация: 06.06.2010
Сообщений: 79
|
![]() Цитата:
Synchronize можно воткнуть в proc2! Видимо, когда первый раз делал эксперимент, получился какой-то экскримент. Всё работает, буду использовать Synchronize. Последний раз редактировалось avd; 20.03.2013 в 11:17. |
|
![]() |
![]() |
![]() |
#6 |
Сумрачная тень
Форумчанин
Регистрация: 05.03.2009
Сообщений: 689
|
![]()
чтение данных из стороннего потока в целом всегда безопасно и не вызовет AV даже при одновременном изменении читаемых данных другим кодом. тут надо уяснить атомарность результата:вы не получите невнятные данные при их чтении во время изменения этих данных. вы получите данные либо до изменения, либо после изменения. например, есть переменная а=5. вы читаете ее из потока, но в это время другой поток меняет ее значение на 8. исходов два: вы получите либо 5, либо 8. это зависит от приоритетов потоков и работы ОС. можно задать вопрос: ок, это если у меня одно ядро в пооцессоре, а если больше, то получим истинный параллелизм? да, так и есть, но в единицу времени ячейка памяти в каждом из банков озу допускает только чтение или запись, так что параллелизма здесь как такового нет. постарался в кратце объяснить природу многопоточности и синхронизации. в чем не прав, поправьте.
но здесь надо быть осторожным. удаление это тоже запись ячеек памяти нулями или освобождения диапазопа. поэтому можно читать данные, которых уже не существует. вот в частности зачем нужны объекты синхронизации
"ковыряю изнутри" (с)
Последний раз редактировалось Stilet; 20.03.2013 в 18:31. |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Как создать метод класса, возвращающий объекты (поля класса) разных типов | frosich | Общие вопросы Delphi | 3 | 01.03.2013 19:29 |
Terminated в потомке класса TThread | Dr. MefistO | Общие вопросы Delphi | 4 | 13.02.2013 16:10 |
GetDC TThread Synchronize - error creating window device context | ZBEP | Общие вопросы Delphi | 2 | 28.08.2012 23:50 |
Возврат значения из класса TThread | Alter | Общие вопросы Delphi | 1 | 27.12.2010 21:48 |
Метод Synchronize класса TThread | EdNovice | Общие вопросы Delphi | 10 | 01.08.2009 14:47 |