![]() |
|
Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply |
![]()
|
|
| Wing |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 19.3.2006 Репутация: нет Всего: нет |
Доброго времени суток. Прочитал материал по синхронизации потоков, там целая тьма способов Event, Mutex, Semaphore... Однако все они также используются для межпроцессной синхронизации, а есть что-нить в пределах одного приложения или можно для такой цели использовать обычные глобальные переменные.
|
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 10 Всего: 133 |
Что именно подразумевается под синхронизацией потоков? Что нужно реализовать? У TThread есть куча стандартных методов, нужно только знать, что нужно
-------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| Wing |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 19.3.2006 Репутация: нет Всего: нет |
Есть некоторая прога которая создает поток для некоторой цели, в ходе работы поток передает информацию о своем состоянии в основной поток. Если основной поток занят то второй поток должен продолжить свое выполнение без передачи данных.
Собственно можно-ли использовать переменную типа Boolean для индикации занят/свободен основного потока. Это сообщение отредактировал(а) Wing - 22.4.2006, 19:03 |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
||||
|
||||
| Sunvas |
|
|||
|
Соль и сахар ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 3388 Регистрация: 12.3.2006 Где: Тосно Репутация: нет Всего: 89 |
Что ты под этим подразумевашь? synchronize({имя процедуры}) -------------------- Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их. |
|||
|
||||
| Wing |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 19.3.2006 Репутация: нет Всего: нет |
||||
|
||||
| Rouse_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 469 Регистрация: 23.4.2005 Репутация: 18 Всего: 29 |
создаешь область хранения, к которой должен обратиться основной поток, к примеру тот-же MemoryMappedFile и через PostMesssage отправляешь ему адрес этой области. Когда главный поток освободиться, он примет твое сообщение и прочитает переданные ему данные находящиеся по переданному указателю, чтобы избежать утечек, желательно после прочтения разрушить MMF. |
|||
|
||||
| Snowy |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 11363 Регистрация: 13.10.2004 Где: Питер Репутация: 30 Всего: 484 |
Для перехода в занятое состояние, главный поток захватывает критическую секцию и начинает работу. Как закончит - освобождает крстическую секцию. Второй поток хочет передать данные. Он пробует захватить критическую секцию. Если не удалось, значит занято. Работаем дальше. Если не занято - захватывает критическую секцию, пишет данные, освобождает, шлет сообщение главному потоку о том, что данные легли - обрабатывай. Главный захватывает критическую секцию, читает данные, обрабатывает, освобождает... и т.д. |
|||
|
||||
| Rouse_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 469 Регистрация: 23.4.2005 Репутация: 18 Всего: 29 |
Snowy, ты кудато не сюда. Зачем главному потоку захват критичской секции когда он должен обрабатывать данные пришедшие от дочерних?
|
|||
|
||||
| Wing |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 19.3.2006 Репутация: нет Всего: нет |
||||
|
||||
| Rouse_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 469 Регистрация: 23.4.2005 Репутация: 18 Всего: 29 |
Wing, Это в чем юмор вот этого ?
По какой книжке так писал? |
|||
|
||||
| Wing |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 19.3.2006 Репутация: нет Всего: нет |
Ни по какой. Потому что в той которая есть ни чего полезного нету - стало быть... плохая книжка. Писал по памяти + Win32 SDK Reference. |
|||
|
||||
| Rouse_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 469 Регистрация: 23.4.2005 Репутация: 18 Всего: 29 |
Блин, или я не правильно обьясняю или одно из двух
Смотри пример:
Тут главный поток занят своим делом, паралельно с ним трудиться второй поток, когда главный освободиться он примет все данные от второстепенного |
|||
|
||||
| Wing |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 19.3.2006 Репутация: нет Всего: нет |
Хм. Видимо воторое Спасибо. Однако вопрос был в другом: как сделать флажок для главного потока? Ибо второй поток не должен отправлять данные если первый занят. Это сообщение отредактировал(а) Wing - 25.4.2006, 22:19 |
|||
|
||||
| Rouse_ |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 469 Регистрация: 23.4.2005 Репутация: 18 Всего: 29 |
Хм, а смысл? Поток всеравно должен гдето буферизировать данные. ИМХО данный вариант который я тебе показал самый оптимальный для тебя, т.к. второй поток не отправляет данные а всего лишь ложит их во времнное хранилище и сигнализирует главному что данные на месте. Когда главный захочет читать - тогда и прочитает..
Главномне обязательно читать сразу по приходу WM_THREAD_NOTIFY, он также может просто запомнить где нибудь у себя указатель на данные, а прочитать их позднее... |
|||
|
||||
![]()
|
| Правила форума "Delphi: WinAPI и системное программирование" | |
|
|
Запрещено: 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |