Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];

Вниз

Synchronize - поясните   Найти похожие ветки 

 
Ega23 ©   (2007-04-19 11:38) [0]

Когда я из потока вызываю метод основного потока через сабж, дополнительный поток блокируется и дожидается исполнения метода, или всё-таки нет?


 
Игорь Шевченко ©   (2007-04-19 11:39) [1]

да


 
Ega23 ©   (2007-04-19 11:40) [2]

да в смысле блокируется?


 
Игорь Шевченко ©   (2007-04-19 11:43) [3]


> да в смысле блокируется?


да :)


 
Ega23 ©   (2007-04-19 11:44) [4]

Большое спасибо!


 
Ega23 ©   (2007-04-19 11:56) [5]

Тогда вопрос по программной архитектуре (и может, имеет смысл ветку из потрепаловки убрать).

Вот есть доп.поток, который передаёт основному потоку через synchronize какие-то данные, потом, на основании результата что-то делает.
Всё нормально работает.
Но нужно программу завершить. Как корректно убить такой поток?
Если ему тупо Terminate вызвать, а он в это время что-то через тот самый synchronize делает, не повиснет ли он намертво?


 
Игорь Шевченко ©   (2007-04-19 11:59) [6]


> Если ему тупо Terminate вызвать, а он в это время что-то
> через тот самый synchronize делает, не повиснет ли он намертво?
>


Тупой вызов Terminate приводит к установке в True свойства Terminated, каковое свойство по-хорошему должно проверятся в методе Execute потока.
Если поток делает что-то через Syncronize, то очевидно, что свойство Terminated будет проверено после окончания процедуры, вызванной через Syncronize. Причин для зависания я не вижу.


 
Ega23 ©   (2007-04-19 12:00) [7]


> каковое свойство по-хорошему должно проверятся в методе
> Execute потока.


О. Об этом не подумал.
Ещё раз большое спасибо!


 
Юрий Зотов ©   (2007-04-19 12:29) [8]

> Ega23 ©   (19.04.07 11:56) [5]

Он не повиснет в прямом смысле, но будет ждать окончания метода, вызванного через Synchronize. И в ЭТОМ смысле, хоть вызывай Terminate, хоть не вызывай - он УЖЕ "висит", поскольку вызвал Synchronize и ждет ответа. И будет "висеть", пока этого ответа не дождется. А Terminate выполнится в ВЫЗВАВШЕМ потоке и просто установит флаг. Больше этот метод ничего не делает.

Можно использовать другие средства синхронизации. Дополнительный поток через Synchronize передает данные основному потоку, тот принимает данные, захватывает какой-то объект синхронизации (например, критическую секцию) и НЕМЕДЛЕННО возвращает ответ дополнительному потоку. Получив ответ, тот выходит из Synchronize, но тут же начинает ждать освобождения этого объекта синхронизации. Теперь дополнительный поток можно разбудить в любой момент, просто освободив объект синхронизации.

При нормальной работе такая схема вряд ли нужна (потому что главный поток, завершив обработку полученных данных, тем самым автоматически выводит дополнительный  поток из Synchronize). Но в ситуациях, когда требуется "разбудить" дополнительный поток ДО или ПОСЛЕ окончания обработки данных (притом, из ЛЮБОГО места кода главного потока), такая схема может быть полезной.


 
Ega23 ©   (2007-04-19 12:57) [9]


> Юрий Зотов ©   (19.04.07 12:29) [8]


Да, это, похоже, то что нужно.
Большое спасибо!



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2007.05.20;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.037 c
15-1177044470
Knight
2007-04-20 08:47
2007.05.20
Предлагаю в конфе "Начинающим" создать и закрепить тему, типа,...


2-1178261833
Doom-2
2007-05-04 10:57
2007.05.20
существует у Flash-ки и ZIV-а какой-нибудь "ID"?


2-1178187768
Marat
2007-05-03 14:22
2007.05.20
Округлить QRExpr


4-1166368282
MasteroK
2006-12-17 18:11
2007.05.20
Как извлечь выделеный текст из Opera и Internet Explorer-a?


15-1176934894
vasIZmax
2007-04-19 02:21
2007.05.20
Re: Опрос





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