![]() |
|
Модераторы: 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, он также может просто запомнить где нибудь у себя указатель на данные, а прочитать их позднее... |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Ну это-то как раз самая тривиальная задача. Достаточно ввести Boolean-флаг и проверять его. -------------------- |
|||
|
||||
| Wing |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 19.3.2006 Репутация: нет Всего: нет |
Rouse_, видимо я так и поступлю.
Демо, читай выше. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Читал. Но не вижу никаких проблем в реализации, так как в твоей задачи не нужно ожидание освобождения ресурса. Следовательно, синхронизация нужна самая примитивная. Для твоей задачи достаточно Boolean-флажков. Это сообщение отредактировал(а) Демо - 28.4.2006, 09:25 -------------------- |
|||
|
||||
| Wing |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 19.3.2006 Репутация: нет Всего: нет |
Демо, нет такое не подходит. До этого я и сам додумался, но иногда вылазиет ошибка о неверном доступе к памяти. |
|||
|
||||
| Демо |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1278 Регистрация: 3.11.2005 Репутация: 6 Всего: 50 |
Просто нужно очень аккуратно и точно работать с указателями и буфрами для записи и чтения. Те указатели, которые используются в разных потоках(сами адреса) нужно защитить критической секцией, либо флагами(Boolean, так как их чтение и запись - атомарная операция). -------------------- |
|||
|
||||
| Wing |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 39 Регистрация: 19.3.2006 Репутация: нет Всего: нет |
Демо, действительно так тоже можно. ;)
Присоединённый файл ( Кол-во скачиваний: 7 )
ScanEngine.zip 4,67 Kb |
|||
|
||||
![]()
|
| Правила форума "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. |