![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Ch0bits |
|
|||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: нет Всего: 62 |
Я сейчас некоторые свои программы перевожу на Delphi. И вот возник вопрос.
Допустим у меня есть несколько нитей(thread), они обращаются к одному ресурсу(объекту). Как мне заблокировать этот объект пока его обрабатывает какая-либо из нитей. В C# есть для этого класс Monitor. Monitor.Enter(object) -> lock object Monitor.Exit(object) -> unlock object |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
function WaitFor: Integer;
Метод WaitFor предназначен для синхронизации и позволяет одному потоку дождаться момента, когда завершится другой поток. Пример: Внутри потока FirstThread пишим код
Можно еще использовать Synchronize(Method: TThreadMethod); Этот метод относится к секции protected, т. е. может быть вызван только из потомков TThread. Delphi предоставляет программисту метод Synchronize для безопасного вызова методов VCL внутри потоков. Во избежание конфликтных ситуаций, метод synchronize дает гарантию, что к каждому объекту VCL одновременно имеет доступ только один поток. Аргумент, передаваемый в метод Synchronize, — это имя метода, который производит обращение к VCL; вызов Synchronize с этим параметром — это то же, что и вызов самого метода. Такой метод (класса TThreadMethod) не должен иметь никаких параметров и не должен возвращать никаких значений. К примеру, в основной форме приложения нужно предусмотреть функцию. Опиши по-подробнее в каком контексте тебе это нужно. Тогда будет легче тебе что-то порекомендовать -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| Ch0bits |
|
|||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: нет Всего: 62 |
У меня есть несколько матриц. Значения их определяют визуальные компоненты.
В тоже время один поток проверяет правильность ввода, второй прогнозирует будущий ввод пользователя, третий ведёт постобработку для дальнейшего использования. Если произойдёт одновременный доступ, то все цифры перемешаются и другие алгоритмы в потоках будут работать неправильно. Может кто-то спросит почему я не сделал всё это без потоков(проще), я лишь скажу что так надо. |
|||
|
||||
| Poseidon |
|
|||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
Используй WaitFor. Думаю этого хватит для реализации. -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
|||
|
||||
| Ch0bits |
|
|||
![]() Python Dev. ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2124 Регистрация: 21.2.2005 Где: Казань Репутация: нет Всего: 62 |
В Delphi ведь потоки можно задавать только как классы, в у меня они заданы как процедуры.
Если не понятно, то вот пример:
Спасибо за помощь. |
|||
|
||||
| Poseidon |
|
||||||||
![]() Delphi developer ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 5273 Регистрация: 4.2.2005 Где: Гомель, Беларусь Репутация: 53 Всего: 133 |
Млин, говорила мама: "Учи сынок Си". До только сынок этот забил на такую важную вещь! Как видно зря. Но попытаемся понять друг друга.
И еще. Что мешает твою процедуру сделать как процедуру Execute класса TThread? Т.е. я об этом
И запускать поток тогда вот так
PS.
Это сообщение отредактировал(а) Poseidon - 30.4.2005, 00:27 -------------------- Если хочешь, что бы что-то работало - используй написанное, если хочешь что-то понять - пиши сам... |
||||||||
|
|||||||||
![]()
|
| Правила форума "Delphi: Общие вопросы" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Delphi: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |