Enter;
Enter();
Метод Enter осуществляет вход в критическую секцию.
После вызова метода Enter, при изменении глобальных переменных класса доступ к ним блокируется до вызова метода Leave. При этом, если из другого потока осуществляется попытка изменить эти же переменные, то работа этого потока будет приостановлена до того момента, пока не появится доступ к переменным.
Для выполнения примера предполагается наличие в репозитории модуля с идентификатором «M_THREAD_CALC». В модуле реализованы указанные классы и метод.
Добавьте ссылку на системную сборку Fore.
Class CCritSection: Object
Shared fcs: IForeCriticalSection;
Public Shared Property CritSection: IForeCriticalSection
Get
Begin
If IsNull(fcs) Then
fcs := New ForeCriticalSection.Create;
End If;
Return fcs;
End Get
End Property CritSection;
End Class CCritSection;
Class CCalculate: Object
Public Shared Res: Double;
Public Shared Error: String;
Public Shared Sub Run;
Var
Method: IForeMethod;
Th1, Th2: IForeThread;
Begin
Method := New ForeMethod.Create;
Method.Assembly := "M_THREAD_CALC";
Method.Method := "Calculate";
//Создание потоков
Th1 := New ForeThread.Create(Method);
Th1.Name := "A";
Th1.Start(Th1);
Th2 := New ForeThread.Create(Method);
Th2.Name := "B";
Th2.Start(Th2);
//...
//Продолжение основной программы с возможностью отслеживания состояния потоков
//...
End Sub Run;
End Class CCalculate;
Sub Calculate(Th: Variant);
Begin
//...
//Действия по выполнению какого-либо расчёта
//...
//Вход в критическую секцию
CCritSection.CritSection.Enter;
If (Th As IForeThread).Name = "A" Then
CCalculate.Res := 100;
CCalculate.Error := "A";
(Th As IForeThread).Sleep(1000);
Else
CCalculate.Res := 200;
CCalculate.Error := "B";
(Th As IForeThread).Sleep(2000);
End If;
//Выход из критической секции
CCritSection.CritSection.Leave;
End Sub Calculate;
Работа с потоками доступна только в языке Fore
В указанном примере при выполнении статического метода «Run» класса «CCalculate» создаются два потока, выполняющих пользовательский метод «Calculate». Сам метод, в зависимости от каких-либо условий, может менять статические поля класса «CCalculate». Для того, чтобы два потока одновременно не изменили поля класса, используется критическая секция, которую реализует класс «CCritSection».
См. также: