Форум по 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;
Ответить с цитированием
  #2  
Старый 11.12.2016, 14:31
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Так метод Get нужно в потоке (внутри Execute) вызывать.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #3  
Старый 12.12.2016, 00:53
Hunter342 Hunter342 вне форума
Прохожий
 
Регистрация: 17.11.2013
Сообщения: 3
Версия Delphi: DELPHI XE10.1u2
Репутация: 10
По умолчанию

Т.е только в Execute?
Процедура Auth, которая описана в потоке, не подойдет получается?
Ответить с цитированием
  #4  
Старый 12.12.2016, 08:33
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Поток реализуется именно методом execute, всё сотальное — в вызываемом (в твоем случае — главном) потоке.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
  #5  
Старый 12.12.2016, 09:45
icWasya icWasya вне форума
Местный
 
Регистрация: 09.11.2010
Сообщения: 499
Репутация: 10
По умолчанию

Самое главное, что Execute явно вызывать не надо!
Ответить с цитированием
  #6  
Старый 12.12.2016, 18:40
Hunter342 Hunter342 вне форума
Прохожий
 
Регистрация: 17.11.2013
Сообщения: 3
Версия Delphi: DELPHI XE10.1u2
Репутация: 10
По умолчанию

Можно пример?
Было бы неплохо, а то я все думал, но пока пришел к другому варианту, распишу его в ответном сообщении
Ответить с цитированием
  #7  
Старый 12.12.2016, 18:52
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Вот пример из c:\Program Files (x86)\Borland\Delphi7\Demos\Threads
Вложения
Тип файла: zip Threads.zip (3.6 Кбайт, 8 просмотров)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ


Delphi Sources

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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter