Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 Единоразовый вызов функции  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10598
Задача: стартует много потоков. Первый поток должен вызвать функцию авторизации. Пока эта функция не вызвана, остальные потоки не имеют права работать. Если функция выбросила исключение, то текущий поток завершается, а остальные пытаются вызвать ее еще раз.

Синхронизацию реализовал на Interlocked-функции. Посмотрите, свежим взглядом на предмет ошибок
+
const
  CNoLogin = 0;   // Никто не авторизовывался
  CProcess = 1;   // Находимся в процессе авторизации
  CSuccess = 2;  // Авторизовались
var
  LLoginState: Integer;
begin
    while True do begin // Из цикла выходим либо по исключению, либо при авторизацииж
      LLoginState := InterlockedCompareExchange(FLoginState, CProcess, CNoLogin);
      case LLoginState of
        CNoLogin: begin
          try
            UsrLogin;
            // Авторизовались
            FLoginState := CSuccess;
            // Выходим
            Break;
          except
            on E: Exception do begin
              // Сбой авторизации
              FLoginState := CNoLogin;
              raise;
            end;
          end;
        end;  // CNoLogin
        CSuccess: Break;  // Уже кто-то авторизовался ранее
      end;  // case LLoginState of
    end;  // while True do begin
end;

С уважением, Vasilisk
31 окт 18, 20:31    [21720836]     Ответить | Цитировать Сообщить модератору
 Re: Единоразовый вызов функции  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10598
Вопрос снят. Т.к. Нужна еще процедура Логаута по принципу "последний закрывает дверь", а новые потоки могут стартовать в любое время, то без глобальной критической секции я решения не вижу
31 окт 18, 20:52    [21720855]     Ответить | Цитировать Сообщить модератору
 Re: Единоразовый вызов функции  [new]
Мимопроходящий
Member

Откуда: бурятский тундрюк, эсквайр
Сообщений: 29230

семафоры не подходят?

Posted via ActualForum NNTP Server 1.5

1 ноя 18, 11:55    [21721280]     Ответить | Цитировать Сообщить модератору
 Re: Единоразовый вызов функции  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10598
Мимопроходящий
семафоры не подходят?
Хотелось разрулить все Interlocked функциями. Не разрулилось
1 ноя 18, 14:48    [21721596]     Ответить | Цитировать Сообщить модератору
 Re: Единоразовый вызов функции  [new]
softwarer
Member

Откуда: 127.0.0.1
Сообщений: 54229
Блог
_Vasilisk_
Если функция выбросила исключение, то текущий поток завершается, а остальные пытаются вызвать ее еще раз.

Эту постановку можно написать иначе: "В случае сетевых проблем несколько случайно выбранных потоков завершаются, остальные работают".
1 ноя 18, 17:01    [21721771]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить