Народ, пишу прогу для личного пользования, которая будет собирать музыку с музыкальных сервисов, но есть пара проблем, одна из них: Потоки
т.к никому не нравится, что программа при работе на какое-то время намертво зависает, пользователь привык: нажал на кнопку а программа тут же ему отвечает, без каких либо зависаний
Создал два класса-потока (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;