Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.12.2016, 13:19   #1
Hunter342
 
Регистрация: 17.11.2013
Сообщений: 5
Восклицание Многопоточность в приложении

Народ, пишу прогу для личного пользования, которая будет собирать музыку с музыкальных сервисов, но есть пара проблем, одна из них: Потоки

т.к никому не нравится, что программа при работе на какое-то время намертво зависает, пользователь привык: нажал на кнопку а программа тут же ему отвечает, без каких либо зависаний

Создал два класса-потока (TThread)
Один для аутентификации, Другой для работы с запросами к API одного из муз.сервисов

Но при выполнении ошибок не происходит, код работает как надо, но.. Либо в потоке самой программы, либо я не знаю как еще, потому-что программа зависает секунды на 1.5-2, когда выполняется код

Приводить весь модуль не буду, а только тот участок, который подвешивает программу во время выполнения кода

Код:
TZaycevRequest = class(TThread)
      Client: TNetHTTPClient;
      protected
        procedure Execute; override;
        function Request(Url: string): string;
    end;
 
TZaycevAuthenticator = class(TThread)
      Client: TNetHTTPClient;
      protected
        procedure Execute; override;
        function Auth(): string;
    end;
 
    TZaycev = class(TObject)
      constructor Create(AOwner: TComponent);
      private
      Authenticator: TZaycevAuthenticator;
      Request: TZaycevRequest;
      public
      // Функции для работы с API Zaycev
      // Авторизация
      function Auth(): boolean;
      var AccessToken: string; //Токен для работы с API
    end;
 
implementation
 
  function TZaycevAuthenticator.Auth: string;
    var
      hToken: string;
      hResponse: TMemoryStream;
      hStr: TStringList;
      X: ISuperObject;
      hMD5: TIdHashMessageDigest5;
      hHash: string;
    begin
      // Получение Hello токена
      hResponse := TMemoryStream.Create;
      Client.Get(ZaycevAPIUrl + ZaycevHelloURL, hResponse);
      hStr := TStringList.Create;
      hStr.LoadFromStream(hResponse);
      X := SO(hStr.Text);
      hStr.Clear;
      hResponse.Clear;
      hToken := X.S['token'];
      if hToken <> '' then
        begin
        //ShowMessage('hello token: ' + #13 + hToken);
          hMD5 := TIdHashMessageDigest5.Create;
          hHash := hMD5.HashStringAsHex(hToken + StaticKey).ToLower;
          //ShowMessage('hToken: ' + hToken + #13 + 'hStaticKey: ' + StaticKey + #13 + 'hHash: ' + hHash);
          if hHash <> '' then
            begin
              Client.Get(ZaycevAPIUrl + ZaycevAuthUrl + 'code=' + hToken +
                  '&hash=' + hHash, hResponse);
              hStr.LoadFromStream(hResponse);
              if hStr.Text <> '' then
                begin
                  X := SO(hStr.Text);
                  Result := X.S['token'];
                end;
            end;
        end;
    end;
 
  procedure TZaycevAuthenticator.Execute;
    begin
      inherited;
      Client := TNetHTTPClient.Create(nil);
      Client.Asynchronous := False;
    end;
 
  { TZaycevRequest }
 
  procedure TZaycevRequest.Execute;
    begin
      inherited;
      Client := TNetHTTPClient.Create(nil);
      Client.Asynchronous := False;
    end;
 
  function TZaycevRequest.Request(Url: string): string;
    begin
      if Url <> '' then
        begin
          //
        end;
    end;
 
{ TMyBaseComponent }
 
function TZaycev.Auth: boolean;
begin
  Authenticator.Execute;
  AccessToken := Authenticator.Auth(); //Авторизация
end;
 
constructor TZaycev.Create(AOwner: TComponent);
begin
  Authenticator := TZaycevAuthenticator.Create(True);
  Request := TZaycevRequest.Create(True);
  Authenticator.Priority := tpLower;
  Request.Priority := tpLower;
 
end;
Hunter342 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многопоточность JOKER:3 Общие вопросы Delphi 10 21.02.2013 10:03
С++ многопоточность kineziz Общие вопросы C/C++ 3 11.09.2012 13:20
многопоточность MasterSporta Общие вопросы C/C++ 4 30.09.2011 13:27
многопоточность Freddi Krjuger Общие вопросы по Java, Java SE, Kotlin 1 15.05.2011 23:46
Многопоточность Neymexa Помощь студентам 3 13.04.2010 11:43