| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Delphi: Общие вопросы > Синхронизация доступа к объету или методу |
| Автор: Гость_Игорь 26.1.2004, 13:37 |
| Привет всем! Вот такой вопрос: DLL имеет внутреннюю переменную. При вызове одного из методов переменная устанавливается в некоторое значение и возвращается указатель на нее в основную программу. А если несколько потоков одновременно вызывают эту функцию в DLL ?? Понятное дело, что в этом участке памяти будет каша. Как синхронизировать потоки? Скажем в Java есть модификатор synchronized который решает проблему. Если в Delphi нет стандартных методов, то можно попытаться решить проблему самому (выставлять флаги в методе, или как-то по другому), но тогда возникает вопрос: как заставить второй поток подождать пока не отработает первый ?? Заранее спасибо. |
| Автор: <Spawn> 26.1.2004, 14:06 |
| А как ты создаешь поток в Дельфе? При помощи наследника класса TThread или на API? Если наследником то у TThread есть метод Synchronize, иначе прийдется реализовывать все самому, например, используя критические секции. |
| Автор: Гость_Игорь 26.1.2004, 16:38 |
| Сорри что недостаточно ясно изложил суть проблемы. Я сам не создаю TThread. На самом деле ситуация такая: Поскольку это есть DLL, то в общем случае ее методы могут вызываться из разных приложений. В моем (частном) случае метод может вызываться из нескольких экземпляров приложения. Т.е. синхронизация должна быть реализована в самой DLL. А как я понял это придется делать самому. А как "использовать критические секции"? Типа try-except ? |
| Автор: <Spawn> 26.1.2004, 17:05 | ||
| На сколько я понял, тебе нужно, чтобы функции твоей ДЛЛ вызывались из разных копйи твоей проги, и чтобы в момент вызова функции, доступ к ее вызову из другого приложения блокировался? Тогда тебе нужно использолвать Мьютексы - см CreateMutex, OpenMutex, ReleaseMutex: Для того чтобы понять как они работают можешь сделать следующий небольшой тест. Создаешь новый проект и пишешь этот код:
После чего запусти 2 копии этого теста и нажми Button1 в одно, а потом в другом - увидишь, что второе окно не будет активно до тех пор, пока не нажмешь Button2 в первом окне. Учти, что на каждый OpenMutex, должен быть сделан ReleaseMutex. |
| Автор: Гость_Игорь 26.1.2004, 17:12 |
| Шаман! Спасибо! |