| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > есть ли аналог Monitor(C#) |
| Автор: Ch0bits 29.4.2005, 21:38 |
| Я сейчас некоторые свои программы перевожу на Delphi. И вот возник вопрос. Допустим у меня есть несколько нитей(thread), они обращаются к одному ресурсу(объекту). Как мне заблокировать этот объект пока его обрабатывает какая-либо из нитей. В C# есть для этого класс Monitor. Monitor.Enter(object) -> lock object Monitor.Exit(object) -> unlock object |
| Автор: Poseidon 29.4.2005, 22:05 | ||
| function WaitFor: Integer; Метод WaitFor предназначен для синхронизации и позволяет одному потоку дождаться момента, когда завершится другой поток. Пример: Внутри потока FirstThread пишим код
Можно еще использовать Synchronize(Method: TThreadMethod); Этот метод относится к секции protected, т. е. может быть вызван только из потомков TThread. Delphi предоставляет программисту метод Synchronize для безопасного вызова методов VCL внутри потоков. Во избежание конфликтных ситуаций, метод synchronize дает гарантию, что к каждому объекту VCL одновременно имеет доступ только один поток. Аргумент, передаваемый в метод Synchronize, — это имя метода, который производит обращение к VCL; вызов Synchronize с этим параметром — это то же, что и вызов самого метода. Такой метод (класса TThreadMethod) не должен иметь никаких параметров и не должен возвращать никаких значений. К примеру, в основной форме приложения нужно предусмотреть функцию. Опиши по-подробнее в каком контексте тебе это нужно. Тогда будет легче тебе что-то порекомендовать |
| Автор: Ch0bits 29.4.2005, 22:23 |
| У меня есть несколько матриц. Значения их определяют визуальные компоненты. В тоже время один поток проверяет правильность ввода, второй прогнозирует будущий ввод пользователя, третий ведёт постобработку для дальнейшего использования. Если произойдёт одновременный доступ, то все цифры перемешаются и другие алгоритмы в потоках будут работать неправильно. Может кто-то спросит почему я не сделал всё это без потоков(проще), я лишь скажу что так надо. |
| Автор: Poseidon 29.4.2005, 23:26 | ||
Используй WaitFor. Думаю этого хватит для реализации. |
| Автор: Ch0bits 29.4.2005, 23:44 | ||
| В Delphi ведь потоки можно задавать только как классы, в у меня они заданы как процедуры. Если не понятно, то вот пример:
Спасибо за помощь. |
| Автор: Poseidon 30.4.2005, 00:22 | ||||||||
Млин, говорила мама: "Учи сынок Си". До только сынок этот забил на такую важную вещь! Как видно зря. Но попытаемся понять друг друга.
И еще. Что мешает твою процедуру сделать как процедуру Execute класса TThread? Т.е. я об этом
И запускать поток тогда вот так
PS.
|