У меня есть приложение, которое имеет несколько форм, каждая форма имеет поток, который выполняет GET() на заданном URL-адресе каждые 3 секунды ... проблема в том, что каждый вызов GET() пользовательского интерфейса зависает до тех пор, пока GET() не будет завершен, и как различные формы выполняют одно и то же действие каждые 3 секунды, приложение выполняется очень медленно, добавляет «IdAntiFreeze» в основную форму, большинство из них не работает, поэтому читайте «IdAntiFreeze», не работает в потоках, следует пример ниже:Delphi TIdHttp freezes thread
private
{ Private declarations }
GlobalHtml : String;
TimerGlobal : Integer;
// Thread
TMyThread= class(TThread)
private
FForm : TForm1;
strTemp: String;
protected
procedure Execute; override;
public
constructor Create(Form : TForm1; gpLinkTemp : String);
destructor Destroy; override;
end;
// получить строку HTTP
procedure TMyThread.GetStringHttp;
var
meuIdHTTP : TIdHttp;
strResponse: String;
begin
meuIdHTTP := TIdHTTP.Create(nil);
strResponse := meuIdHTTP.Get('url...'); //<-- freezes up complete
FForm.GlobalHtml := strResponse; //<-- private form variable
end;
// выполнить
procedure TMyThread.Execute;
begin
while not (terminated) do
begin
Synchronize(GetStringHttp);
FForm.LabelStatus.Visible := False;
FForm.ButtonStatus.Enabled := False;
FForm.TimerStatus.Enabled := True;
if FForm.TimerGlobal >= 10 then
begin
Synchronize(UpdateGrid);
FForm.TimerGlobal := 0;
end;
end;
end;
// обновление TStringGrid по форме
procedure TForm1.UpdateGrid;
begin
//I update the TStringGrid here with the data of variable
TSGridDados.Cells[0,1] := GlobalHtml;
//...
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Inc(TimerGlobal);
end;
Вызов Thread:
procedure TForm1.Button1Click(Sender: TObject);
begin
TMyThread.Create(Self, 'string-url');
end;
Если Интернет медленнее или сервер реагирует, еще хуже, Есть ли какая-либо специальная конфигурация в компоненте TIdHttp, чтобы избежать этого? Почему это происходит? Заранее спасибо!
Как вы выполняете свою нить? Я думаю, что вы можете называть только «Yourthread.Execute», и в этом случае вы просто вызываете метод синхронно, как если бы это был какой-либо другой метод. Если вы правильно выполнили триад (используя YourThread.Start), вы не столкнетесь с этой проблемой. Если эта информация вам не поможет, добавьте фрагмент кода, который вызывает поток на ваш вопрос, чтобы мы могли его проверить и исправить. – GolezTrol
Что для FForm (TForm1) используется в вашей теме? Обновление GUI (Form1) при выполнении метода потока небезопасно. Perharps вам следует предоставить любые оставшиеся коды на TMyThread.Execute для лучшего анализа ... – theodorusap
'TIdHTTP.Get()' работает в контексте потока, который его вызывает. Учитывая код, который вы указали, нет никакого способа, чтобы вызов 'Get()' в контексте рабочего потока мог вызвать любое замораживание в основном потоке пользовательского интерфейса. Так что что-то еще в вашем проекте должно вызывать зависания. –