MaratBest Опубликовано 6 февраля, 2017 Поделиться Опубликовано 6 февраля, 2017 Добрый день !!! есть вот такой код для загрузки текста с сайта и картинок. Является ли это оптимальным кодом , или же есть проще код ? после нажатии кнопки приложение зависает, довольно на долго , на реальном устройстве, иногда android выдает что программа зависла, и спрашивает зарыть приложение или нет. может нужно в поток сделать ? procedure TForm.Button3Click(Sender: TObject); procedure LoadWebImage(url: string; image : TBitmap); var idhttp : TIdHTTP; ms : TMemoryStream; begin IdHTTP := TIdHTTP.Create(nil); ms := TMemoryStream.Create; try idhttp.Get(url, ms); ms.Position := 0; image.LoadFromStream(ms); finally ms.Free; idhttp.Free; end; end; procedure LoadWebText(url: string); var idhttp : TIdHTTP; ms : TMemoryStream; begin IdHTTP := TIdHTTP.Create(nil); ms := TMemoryStream.Create; try idhttp.Get(url, ms); ms.Position := 0; memo1.Lines.LoadFromStream(ms); finally ms.Free; idhttp.Free; end; end; begin LoadWebText('http://google/text.php'); LoadWebImage('http://google/screen1.png', image1.Bitmap); end; Цитата Ссылка на комментарий
0 rareMax Опубликовано 6 февраля, 2017 Поделиться Опубликовано 6 февраля, 2017 58 минут назад, MaratBest сказал: может нужно в поток сделать ? Вы правы. Brovin Yaroslav и MaratBest 2 Цитата Ссылка на комментарий
0 Rusland Опубликовано 6 февраля, 2017 Поделиться Опубликовано 6 февраля, 2017 56 минут назад, MaratBest сказал: может нужно в поток сделать ? Именно в поток TTask.Run( procedure begin TThread.Synchronize(TThread.CurrentThread, procedure begin end); end); MaratBest 1 Цитата Ссылка на комментарий
0 krapotkin Опубликовано 6 февраля, 2017 Поделиться Опубликовано 6 февраля, 2017 и еще вместо idHTTP нужно использовать THTTPClient Brovin Yaroslav и MaratBest 2 Цитата Ссылка на комментарий
0 Модераторы Andrey Efimov Опубликовано 6 февраля, 2017 Модераторы Поделиться Опубликовано 6 февраля, 2017 Например, можно использовать TNetHTTPClient и свойство Asynchronous. Равиль Зарипов (ZuBy), Brovin Yaroslav и marsden 3 Цитата Ссылка на комментарий
0 Major Опубликовано 6 февраля, 2017 Поделиться Опубликовано 6 февраля, 2017 9 часов назад, Rusland сказал: Именно в поток TTask.Run( procedure begin TThread.Synchronize(TThread.CurrentThread, procedure begin end); end); извиняюсь, а зачем TTask? Можно же одним TThread обойтись Цитата Ссылка на комментарий
0 MaratBest Опубликовано 7 февраля, 2017 Автор Поделиться Опубликовано 7 февраля, 2017 Всем большое спасибо за ответы !!! procedure TForm1.Button1Click(Sender: TObject); begin TTask.Run( procedure function LoadWebText(const URL: string): string; var MS: TStringStream; Return: IHTTPResponse; begin Result := ''; with TNetHTTPClient.Create(nil) do begin MS := TStringStream.Create('', TEncoding.ANSI); Return := Get( URL, MS); Result := MS.DataString; MS.Free; Free; end; end; PROCEDURE LoadWebImage(URL: string) ; var IdHTTP: TNetHTTPClient; ms : TMemoryStream; begin IdHTTP := TNetHTTPClient.Create(nil); MS := TMemoryStream.Create; try idhttp.Get (URL, MS); MS.Position := 0; image1.Bitmap.LoadFromStream(MS); finally idhttp.Free; MS.FREE; end; enD; begin memo1.Lines.Text:=LoadWebText('http://google/text.php'); LoadWebImage('http://google/screen1.png'); // выполняем загрузку файла из интернета; TThread.Synchronize(nil, procedure begin // выполняем действия связанные с визуальными компонентами label1.Text:='Загрузка списка игр с сайта'; label1.Repaint; end); end); label1.Text:=''; end; Заменил TNetHTTPClient и пробую через поток в итоге image1 пустой, label1 надпись просто очищается и все при запуске в win32 при первом запуске в image1 какой то мусор, второй раз картинка грузится что делаю не так..... Цитата Ссылка на комментарий
0 krapotkin Опубликовано 7 февраля, 2017 Поделиться Опубликовано 7 февраля, 2017 действия с визуальными компонентами должны быть в Synchronize как тут и написано, а это не так 4 часа назад, MaratBest сказал: image1.Bitmap.LoadFromStream(MS); 4 часа назад, MaratBest сказал: memo1.Lines.Text:=LoadWebText('http://google/text.php'); кроме того Get это не процедура а функция, неплохо бы проверять результат выполнения. ну и NetHttpClient это обертка над THttpClient так что логичнее в базовом функционале использовать именно его Чтобы упростить отладку, я бы все-таки поступил олдскульно. Создал бы потомка TThread и там метод Execute все как положено. При выходе из потока нужно кинуть обработчик TMyThread.OnTerminate и там уже выполнять все работы с визуальными компонентами Для первичной отладки я обычно создаю объект этого класса , но не стартую поток. а просто выполняю Execute если все идет нормально, заменяю MyThread.Execute на MyThread.Start ... Цитата Ссылка на комментарий
0 MaratBest Опубликовано 7 февраля, 2017 Автор Поделиться Опубликовано 7 февраля, 2017 2 часа назад, krapotkin сказал: действия с визуальными компонентами должны быть в Synchronize как тут и написано, а это не так 7 часов назад, MaratBest сказал: image1.Bitmap.LoadFromStream(MS); 7 часов назад, MaratBest сказал: memo1.Lines.Text:=LoadWebText('http://google/text.php'); Спасибо за ответ. вынес все вроде как нужно procedure TForm1.Button1Click(Sender: TObject); var MStext:string; begin AniIndicator1.Enabled:=true; label1.Text:='Загрузка ...'; memo1.Lines.Clear; TTask.Run( procedure function LoadWebText(const URL: string): string; var MS: TStringStream; Http: THTTPClient; begin Result := ''; Http:=THTTPClient.Create; MS := TStringStream.Create('', TEncoding.ANSI); Http.Get( URL, MS); Result := MS.DataString; MS.Free; Http.Free; end; begin MStext:=LoadWebText('https://hi-tech.mail.ru/news/samsung-galaxy-s8-photo/?frommail=1'); TThread.Synchronize(nil, procedure begin // выполняем действия связанные с визуальными компонентами memo1.Lines.Text:=MStext; AniIndicator1.Enabled:=False; end); end); label1.Text:=''; end; на win 32 код работает на ура ! на устройствах AniIndicator сперва запускается , через секунду зависает , запрос возвращается AniIndicator в половинчатом состоянии ... печалька попробую 2 часа назад, krapotkin сказал: Чтобы упростить отладку, я бы все-таки поступил олдскульно. Создал бы потомка TThread и там метод Execute все как положено. При выходе из потока нужно кинуть обработчик TMyThread.OnTerminate и там уже выполнять все работы с визуальными компонентами Для первичной отладки я обычно создаю объект этого класса , но не стартую поток. а просто выполняю Execute если все идет нормально, заменяю MyThread.Execute на MyThread.Start ... Цитата Ссылка на комментарий
0 krapotkin Опубликовано 7 февраля, 2017 Поделиться Опубликовано 7 февраля, 2017 ну, потенциальное место проблемное есть в кодировке ms создается в ANSI а вот get происходит в некоей дефолтной скорее всего UTF-8, т.к. никаких заголовков в HttpClient вы не установили. например FHttp:=THTTPClient.Create(); FHttp.AcceptCharSet:='utf-8'; FHttp.ContentType:='application/json'; FHttp.Accept := 'application/json'; FHttp.CustomHeaders['Accept-Language']:='ru_RU'; Rusland 1 Цитата Ссылка на комментарий
Вопрос
MaratBest
Добрый день !!!
есть вот такой код для загрузки текста с сайта и картинок.
Является ли это оптимальным кодом , или же есть проще код ?
после нажатии кнопки приложение зависает, довольно на долго ,
на реальном устройстве, иногда android выдает что программа зависла, и спрашивает зарыть приложение или нет.
может нужно в поток сделать ?
Ссылка на комментарий
9 ответов на этот вопрос
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.