Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

 
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 11.12.2016, 11:29
Hunter342 Hunter342 вне форума
Прохожий
 
Регистрация: 17.11.2013
Сообщения: 3
Версия Delphi: DELPHI XE10.1u2
Репутация: 10
Восклицание Многопоточность в приложениях

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

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

Создал два класса-потока (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;
Ответить с цитированием
 


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:02.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter