Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.03.2013, 10:03   #1
avd
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 79
По умолчанию Метод Synchronize класса TThread

Известно, что при использовании в приложении дополнительного потока "Методы и свойства объектов из библиотеки визуальных компонентов могут использоваться только в рамках вызова метода Synchronize ...".
Понятно, что изменение свойств визуального компонента должно выполнятся из того потока который им владеет, то есть из основного.
А как насчёт чтения? Я думаю чтение просто в Execute без Synchronize. А вы как считаете?
avd вне форума Ответить с цитированием
Старый 20.03.2013, 10:06   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Считаю что только из Synchronize. Кто знает, что в это время происходит с этим свойством в основном потоке
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 20.03.2013, 10:36   #3
avd
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 79
По умолчанию

Пока 1:1.
Если честно то я тоже склоняюсь к вашему мнению, но
у меня есть желание чтобы это было не так. Например:

Код:
procedure TThrd.Execute;
begin
...
 proc1(); 
 proc2(); 
...
end;

procedure TThrd.proc2();
...
 Cell := Form1.StringGrid1.Cells[1,2]
// Synchronize сюда не воткнёш, и придётся весь код
// процедуры proc2 тащить в Execute
...
avd вне форума Ответить с цитированием
Старый 20.03.2013, 10:56   #4
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Если чтение - атомарная операция, то, в принципе, можно не синхронизировать.
Только под "чтением" подразумевается не одна, все операции чтения, которые Вы можете сделать из неосновного потока.
Т.е. если Вам нужно значение двух разных ячеек - это уже не атомарная операция.
s-andriano вне форума Ответить с цитированием
Старый 20.03.2013, 11:00   #5
avd
Пользователь
 
Регистрация: 06.06.2010
Сообщений: 79
По умолчанию

Цитата:
Сообщение от avd Посмотреть сообщение
Пока 1:1.
Если честно то я тоже склоняюсь к вашему мнению, но
у меня есть желание чтобы это было не так. Например:

Код:
procedure TThrd.Execute;
begin
...
 proc1(); 
 proc2(); 
...
end;

procedure TThrd.proc2();
...
 Cell := Form1.StringGrid1.Cells[1,2]
// Synchronize сюда не воткнёш, и придётся весь код
// процедуры proc2 тащить в Execute
...
ААААА..... Каюсь!!!!
Synchronize можно воткнуть в proc2! Видимо, когда первый раз делал эксперимент, получился какой-то экскримент.
Всё работает, буду использовать Synchronize.

Последний раз редактировалось avd; 20.03.2013 в 11:17.
avd вне форума Ответить с цитированием
Старый 20.03.2013, 18:07   #6
3D Hunter
Сумрачная тень
Форумчанин
 
Аватар для 3D Hunter
 
Регистрация: 05.03.2009
Сообщений: 689
По умолчанию

чтение данных из стороннего потока в целом всегда безопасно и не вызовет AV даже при одновременном изменении читаемых данных другим кодом. тут надо уяснить атомарность результата:вы не получите невнятные данные при их чтении во время изменения этих данных. вы получите данные либо до изменения, либо после изменения. например, есть переменная а=5. вы читаете ее из потока, но в это время другой поток меняет ее значение на 8. исходов два: вы получите либо 5, либо 8. это зависит от приоритетов потоков и работы ОС. можно задать вопрос: ок, это если у меня одно ядро в пооцессоре, а если больше, то получим истинный параллелизм? да, так и есть, но в единицу времени ячейка памяти в каждом из банков озу допускает только чтение или запись, так что параллелизма здесь как такового нет. постарался в кратце объяснить природу многопоточности и синхронизации. в чем не прав, поправьте.

но здесь надо быть осторожным. удаление это тоже запись ячеек памяти нулями или освобождения диапазопа. поэтому можно читать данные, которых уже не существует. вот в частности зачем нужны объекты синхронизации
"ковыряю изнутри" (с)

Последний раз редактировалось Stilet; 20.03.2013 в 18:31.
3D Hunter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как создать метод класса, возвращающий объекты (поля класса) разных типов 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