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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2010, 07:53   #1
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию синхронизация в потоках

мне нужно из потока обратиться к св-вам формы.
для этого предусмотрен метод Synchronize(); - жутко неудобная вещь...
я тут подумал, если уж поток "не знает" о форме из которой он запущен,
но он ведь может достучаться до окна по его идентификатору?
т.е. абсолютная адресация.
как такое реализовать?
xrob вне форума Ответить с цитированием
Старый 14.11.2010, 11:38   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
если уж поток "не знает" о форме из которой он запущен,
А почему бы ему не указать в какой форме он запущен?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.11.2010, 17:05   #3
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

ну так я вроде и спросил, как это сделать.
или нет?
я видите ли не читал толстую книжку про поотоки,
так, хапнул с какого-то форума небольшой пример.
ну так как все-таки сказать потоку в какой форме он запущен?
хотя, я может неправильно выразился...
мне нужен доступ из потока к компонентам формы, StringGrid например.
подскажите? =)

ОБОЖЕМОЙ!!! как все оказалось просто! ыыыы
*me бъется башкой об стенку

вот скажите мне тупому, господа профессионалы,
зачем нужна вся эта канитель с синхронизацией:

Synchronize(SendData);

если можно просто в потоке написать

form1.label.caption('превед медвед!');

и будет работать, проверял!
ыыы =)

У нас принято оформлять код специальным тэгом - при помощи кнопочки "#".
Только...
И не значком #.
И не РНР-кодом.
И не значком цитаты.
И не собственными "ручками".
Рекомендую. Помимо общих правил форума есть и дополнения к ним в каждом разделе...
Модератор

З.Ы. Не похоже, что понял.
Если б понял, то не хамил бы, а исправил...

Последний раз редактировалось mihali4; 15.11.2010 в 18:27. Причина: да ладно, ладно, понял =)
xrob вне форума Ответить с цитированием
Старый 14.11.2010, 17:30   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Вы программирование хотите освоить "методом тыка"?
Уверяю, "вумную" литературу читать придется. И чем раньше, тем лучше. И перечитывать несколько раз тоже придется...
mihali4 вне форума Ответить с цитированием
Старый 14.11.2010, 18:36   #5
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

посмотрите мои примеры(и не тока мои) с полями потоков.
переопределяется конструктор для этого.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 14.11.2010, 19:02   #6
notHaker
Форумчанин
 
Аватар для notHaker
 
Регистрация: 01.12.2009
Сообщений: 569
По умолчанию

Ибо к форме обращается и процесс, то может возникнуть ситуация, когда в кусок памяти (это может быть что угодно и строка тоже, уважаемый xrob) записывает процесс свои данные и в момент когда он их ещё не дописал, система передаёт управление потоку (в том и фишка, что процессорное время у всех своё, а память одна!) и тот считая, что процесс данные обновил, начинает их модифицировать (даже если будет просто читать). В итоге получается коллизия... И всё это добро может закончится совершенно не предсказуемо.
Исходя из выше сказанного, такой процесс обработки называется асинхронным. И если, скажем, в операциях ввода-вывода (а они, кстати, очень медленные и слегка "притормаживают" сам процесс своими неизбежными задержками) это вполне приемлемо, то в графике это используется ооочень редко. Однако где бы не использовались потоки, при обмене информации между ними и, сбсно, процессом и любым потоком, нужно применять принудительную синхронизацию, иначе алгоритмы программы "улетят в космос" (и лови их потом, ибо очень трудно отладить эти "вытягивающие мозги и время" куски кода).
Для синхронизации под виндовс применяются "критические секции" (на самом деле это один из методов и самый простой). Она открывается (Enter) и закрывается (Leave) одним единственным потоком или процессом. Если, например, в момент открытия потоком критической секции, её пытается открыть конкурент, то он неизбежно зависнет, пока секцию не закроет текущий, открывший владелец. Таким образом регулируется синхронизация чтения и записи куска памяти разными потоками.
Код - это работа, а работа стоит денег.

pz-game.ru. 2d зомби-сурвивал для олдфагов.

Последний раз редактировалось notHaker; 15.11.2010 в 02:47.
notHaker вне форума Ответить с цитированием
Старый 14.11.2010, 20:49   #7
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
как все оказалось просто!
Вершина айсберга.
Ничего, Титаник, не горюй. Еще получишь опыт с потоками когда агромную гулю набьешь себе
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.11.2010, 23:20   #8
xrob
Форумчанин
 
Регистрация: 18.10.2010
Сообщений: 419
По умолчанию

да ладно, для моих целей сойдет! =)
ибо у меня только один поток,
который время от времени продвигает прогрессбар в форме,
да дописывает пару строчек в stringGrid.
мне поток нужен только для того чтоб форма не висела во время работы программы

а как я понял из ваших объяснений может произойти следующее:
Код:
есть два потока
допустим один поток начал присваивать значение label1 на форме
а второй в этот момент начал читать значение label1
и в результате второй поток прочитает не все значение.
то бишь коллизия...
все верно?
ну у меня такое исключено, так что все норм =)
спасибо за участие.

p.s.
да и потом хрен с ним!
если будет глючить сделаю с синхронизацией!
я уже разработал систему как можно наиболее адекватно передавать данные в форму =)
надо вызвать только одну процедуру, а не по 10 прописывать для каждого label1...

Последний раз редактировалось xrob; 14.11.2010 в 23:25.
xrob вне форума Ответить с цитированием
Старый 15.11.2010, 17:25   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
ну у меня такое исключено
Исмей тоже так думал
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Suspend и Resume в потоках (C#) lot555 C# (си шарп) 0 31.10.2010 20:37
Считывание значений переменных в потоках Руслантус Общие вопросы .NET 1 09.09.2010 15:39
Чтение файла в нескольких потоках DarkEvil Общие вопросы Delphi 7 30.11.2009 12:06