![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Gershkovich |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 8.2.2006 Репутация: 0 Всего: 2 |
Всем привет!
Скажите может ли быть такая ситуация: VCL поток выполняет метод А некоторое время В этот момент другой поток вызывает метод Synchronize(B) Т.е. VCL поток должен выполнить метод В Так вот вопрос : Выполнится ли метод А до конца или возможна ситуация когда выполнение А приостанавливается затем выполняется В, и снова возвращается в А ? Заранее спасибо. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
Вот чего говорит наш великий мануал о потоках в делфи
Т.е. работать оно будет, но не самым эффективным образом. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
Так, стоп! Метод Synchronize используется для безопасного вызова методов VCL внутри потоков. Т.е. если "другой поток" выполняет Synchronize(B), то B выполнится в рамках этого "другого" потока, и никак не отразится на работе потока А., т.е. А в, этом случае, выполнится до конца.
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| VICTAR |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1108 Регистрация: 6.10.2006 Репутация: 37 Всего: 80 |
||||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
VICTAR, я вот так понял: у нас 2 потока и 2 метода. Каждый метод выполняется в своем потоке. С какого перепугу один из них будет останавливаться?
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| VICTAR |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1108 Регистрация: 6.10.2006 Репутация: 37 Всего: 80 |
А я понял, что у нас один главный VCL поток и один "другой" поток.
ЗЫ я ничего не утверждаю, просто высказал свое предположение. |
|||
|
||||
| Gershkovich |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 8.2.2006 Репутация: 0 Всего: 2 |
Poseidon, насколько я понимаю Synchronize, оба метода выполняются в главном потоке
"Другой поток" просто просит главный выполнить метод В и ждет пока главный не выполнит этот метод. VICTAR прав Это сообщение отредактировал(а) Gershkovich - 3.3.2008, 16:28 |
|||
|
||||
| Rennigth |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1708 Регистрация: 21.6.2004 Где: Moscow Репутация: 49 Всего: 76 |
Assign a method to WakeMainThread before calling a thread’s Synchronize method. When you call a thread’s Synchronize method, it calls the method assigned to WakeMainThread once it has obtained a lock on the main GUI thread. This allows other threads to quickly synchronize with the GUI thread even if no events are being processed due to an idle state. -------------------- (* Honesta mors turpi vita potior *) |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Alexeis же во втором посте все написал. что тут еще за гадания на кофейной гуще? )
-------------------- There are always someone smarter than you... |
|||
|
||||
| Gershkovich |
|
|||
![]() Бывалый ![]() Профиль Группа: Участник Сообщений: 243 Регистрация: 8.2.2006 Репутация: 0 Всего: 2 |
Экспериментальным путем было установлено, что ни один из методов
не прерывается. Т.е. метод В не начнется пока не закончится А и наооборот |
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
Gershkovich, это из кода VCL ясно)
-------------------- There are always someone smarter than you... |
|||
|
||||
| dumb |
|
|||
![]() sceloglauxalbifacies ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2929 Регистрация: 16.6.2006 Репутация: 13 Всего: 158 |
запутали бедолагу.
все верно. еще разок, для закрепления: Synchronize просто добавляет адрес переданного ему метода в глобальный список, который проверяется главным потоком - если есть элемент, то происходит вызов процедуры(адрес которой содержится в элементе) в контексте главного потока. по окончании выполнения этой процедуры главный поток сигнализирует рабочему потоку, вызвавшему Synchronize, что можно продолжать работать. т.е. никаких выполнений "вперемешку" нет - все происходит в контексте главного потока "в порядке общей очереди". |
|||
|
||||
| GrigorievAnton |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 4 Регистрация: 2.3.2008 Репутация: нет Всего: нет |
На самом деле такая ситуация возможна, если метод A вызывает Application.ProcessMessages - Application.ProcessMesages проверяет очередь синхронизированных методов и выполняет первый из неё. Если не вызывает - то действительно в порядке общей очереди.
|
|||
|
||||
| MetalFan |
|
|||
![]() Аццкий Сотона ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 3815 Регистрация: 2.10.2006 Где: Moscow Репутация: 62 Всего: 128 |
не вижу смысла вызова ProcessMessages в синхронизируемой функции. хотя что только в голову людям не придет)
-------------------- There are always someone smarter than you... |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 109 Всего: 459 |
С таким же успехом можно досрочно выйти из критической секции или сигнализировать семафор, но это просто глупо в данной ситуации. -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |