| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: WinAPI и системное программирование > Синхронизация с потоком |
| Автор: Wing 22.4.2006, 18:39 |
| Доброго времени суток. Прочитал материал по синхронизации потоков, там целая тьма способов Event, Mutex, Semaphore... Однако все они также используются для межпроцессной синхронизации, а есть что-нить в пределах одного приложения или можно для такой цели использовать обычные глобальные переменные. |
| Автор: Poseidon 22.4.2006, 18:42 |
| Что именно подразумевается под синхронизацией потоков? Что нужно реализовать? У TThread есть куча стандартных методов, нужно только знать, что нужно |
| Автор: Wing 22.4.2006, 18:56 |
| Есть некоторая прога которая создает поток для некоторой цели, в ходе работы поток передает информацию о своем состоянии в основной поток. Если основной поток занят то второй поток должен продолжить свое выполнение без передачи данных. Собственно можно-ли использовать переменную типа Boolean для индикации занят/свободен основного потока. |
| Автор: Sunvas 23.4.2006, 00:28 |
Что ты под этим подразумевашь? synchronize({имя процедуры}) |
| Автор: Wing 23.4.2006, 15:26 | ||
Я имею ввиду что поток занят некоторой работой.
Во! Ты меня понял. Как можно такое обойти? |
| Автор: Rouse_ 23.4.2006, 15:31 | ||
создаешь область хранения, к которой должен обратиться основной поток, к примеру тот-же MemoryMappedFile и через PostMesssage отправляешь ему адрес этой области. Когда главный поток освободиться, он примет твое сообщение и прочитает переданные ему данные находящиеся по переданному указателю, чтобы избежать утечек, желательно после прочтения разрушить MMF. |
| Автор: Snowy 23.4.2006, 15:48 | ||
Второй поток хочет передать данные. Он пробует захватить критическую секцию. Если не удалось, значит занято. Работаем дальше. Если не занято - захватывает критическую секцию, пишет данные, освобождает, шлет сообщение главному потоку о том, что данные легли - обрабатывай. Главный захватывает критическую секцию, читает данные, обрабатывает, освобождает... и т.д. |
| Автор: Rouse_ 23.4.2006, 18:31 |
| Snowy, ты кудато не сюда. Зачем главному потоку захват критичской секции когда он должен обрабатывать данные пришедшие от дочерних? |
| Автор: Wing 23.4.2006, 20:18 |
| Ну допустим такой проект: |
| Автор: Rouse_ 23.4.2006, 20:28 | ||
Wing, Это в чем юмор вот этого ?
По какой книжке так писал? |
| Автор: Wing 23.4.2006, 21:37 |
Ни по какой. Потому что в той которая есть ни чего полезного нету - стало быть... плохая книжка. Писал по памяти + Win32 SDK Reference. |
| Автор: Rouse_ 24.4.2006, 08:59 | ||
| Блин, или я не правильно обьясняю или одно из двух Смотри пример:
Тут главный поток занят своим делом, паралельно с ним трудиться второй поток, когда главный освободиться он примет все данные от второстепенного |
| Автор: Wing 25.4.2006, 22:14 |
Хм. Видимо воторое Спасибо. Однако вопрос был в другом: как сделать флажок для главного потока? Ибо второй поток не должен отправлять данные если первый занят. |
| Автор: Rouse_ 26.4.2006, 08:15 |
| Хм, а смысл? Поток всеравно должен гдето буферизировать данные. ИМХО данный вариант который я тебе показал самый оптимальный для тебя, т.к. второй поток не отправляет данные а всего лишь ложит их во времнное хранилище и сигнализирует главному что данные на месте. Когда главный захочет читать - тогда и прочитает.. Главномне обязательно читать сразу по приходу WM_THREAD_NOTIFY, он также может просто запомнить где нибудь у себя указатель на данные, а прочитать их позднее... |
| Автор: Демо 27.4.2006, 10:17 |
Ну это-то как раз самая тривиальная задача. Достаточно ввести Boolean-флаг и проверять его. |
| Автор: Wing 27.4.2006, 20:31 |
| Rouse_, видимо я так и поступлю. Демо, читай выше. |
| Автор: Демо 28.4.2006, 09:23 |
Читал. Но не вижу никаких проблем в реализации, так как в твоей задачи не нужно ожидание освобождения ресурса. Следовательно, синхронизация нужна самая примитивная. Для твоей задачи достаточно Boolean-флажков. |
| Автор: Wing 29.4.2006, 13:20 | ||||
| Демо, нет такое не подходит. До этого я и сам додумался, но иногда вылазиет ошибка о неверном доступе к памяти.
|
| Автор: Демо 29.4.2006, 17:33 | ||
Просто нужно очень аккуратно и точно работать с указателями и буфрами для записи и чтения. Те указатели, которые используются в разных потоках(сами адреса) нужно защитить критической секцией, либо флагами(Boolean, так как их чтение и запись - атомарная операция). |
| Автор: Wing 3.5.2006, 21:10 |
| Демо, действительно так тоже можно. ;) |