Чтобы сервер был более отзывчивым, вынесем долгие операции в отдельный поток и сразу же вернем ответ клиенту.
Навеяно постом со stackOverFlow
Вот тестовый код.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
procedure TServer.IdHTTPServerCommandGet(AContext: TIdContext; ARequestInfo: TIdHTTPRequestInfo; AResponseInfo: TIdHTTPResponseInfo); var t: TSomeThread; begin t := TSomeThread.Create(true); t.FreeOnTerminate := true; t.Start; // AResponseInfo.ResponseNo := 200; AResponseInfo.CacheControl := 'no-cache'; AResponseInfo.CustomHeaders.Add('Access-Control-Allow-Origin: *'); AResponseInfo.ContentText := 'ok'; AResponseInfo.ResponseNo := 200; AResponseInfo.WriteContent; Beep; end; |
Код потока
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
unit uSomeThread; interface uses System.Classes; type TSomeThread = class(TThread) private { Private declarations } protected procedure Execute; override; end; implementation { TSomeThread } procedure TSomeThread.Execute; begin { Place thread code here } // Beep; Sleep(10000); end; end. |