![]() |
|
Модераторы: Poseidon, Snowy, bems, MetalFan |
![]()
|
|
| Гость_Игорь |
|
|||
|
Unregistered |
Привет всем!
Вот такой вопрос: DLL имеет внутреннюю переменную. При вызове одного из методов переменная устанавливается в некоторое значение и возвращается указатель на нее в основную программу. А если несколько потоков одновременно вызывают эту функцию в DLL ?? Понятное дело, что в этом участке памяти будет каша. Как синхронизировать потоки? Скажем в Java есть модификатор synchronized который решает проблему. Если в Delphi нет стандартных методов, то можно попытаться решить проблему самому (выставлять флаги в методе, или как-то по другому), но тогда возникает вопрос: как заставить второй поток подождать пока не отработает первый ?? Заранее спасибо. |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
А как ты создаешь поток в Дельфе? При помощи наследника класса TThread или на API? Если наследником то у TThread есть метод Synchronize, иначе прийдется реализовывать все самому, например, используя критические секции.
-------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| Гость_Игорь |
|
|||
|
Unregistered |
Сорри что недостаточно ясно изложил суть проблемы.
Я сам не создаю TThread. На самом деле ситуация такая: Поскольку это есть DLL, то в общем случае ее методы могут вызываться из разных приложений. В моем (частном) случае метод может вызываться из нескольких экземпляров приложения. Т.е. синхронизация должна быть реализована в самой DLL. А как я понял это придется делать самому. А как "использовать критические секции"? Типа try-except ? |
|||
|
||||
| <Spawn> |
|
|||
![]() Око кары:) ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 2776 Регистрация: 29.1.2003 Где: Екатеринбург Репутация: 44 Всего: 64 |
На сколько я понял, тебе нужно, чтобы функции твоей ДЛЛ вызывались из разных копйи твоей проги, и чтобы в момент вызова функции, доступ к ее вызову из другого приложения блокировался? Тогда тебе нужно использолвать Мьютексы - см CreateMutex, OpenMutex, ReleaseMutex:
Для того чтобы понять как они работают можешь сделать следующий небольшой тест. Создаешь новый проект и пишешь этот код:
После чего запусти 2 копии этого теста и нажми Button1 в одно, а потом в другом - увидишь, что второе окно не будет активно до тех пор, пока не нажмешь Button2 в первом окне. Учти, что на каждый OpenMutex, должен быть сделан ReleaseMutex. -------------------- "Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков. |
|||
|
||||
| Гость_Игорь |
|
|||
|
Unregistered |
Шаман!
Спасибо! |
|||
|
||||
![]()
|
| Правила форума "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. |