<?xml version='1.0' encoding="utf-8"?>
      <rss version='2.0'>
      <channel>
      <title>Форум на Исходниках.RU</title>
      <link>https://forum.sources.ru</link>
      <description>Форум на Исходниках.RU</description>
      <generator>Форум на Исходниках.RU</generator>
  	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=421113&amp;view=findpost&amp;p=3844402</guid>
        <pubDate>Fri, 05 Feb 2021 13:50:58 +0000</pubDate>
        <title>twebbrowser - память и скорость работы</title>
        <link>https://forum.sources.ru/index.php?showtopic=421113&amp;view=findpost&amp;p=3844402</link>
        <description><![CDATA[filh: Память забивается с одного потока? Если да, то можно поиграться с динамическим созданием компоненты. Создали - получили данные, очистили. Ну и так по кругу.]]></description>
        <author>filh</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      <item>
        <guid isPermaLink='true'>https://forum.sources.ru/index.php?showtopic=421113&amp;view=findpost&amp;p=3843835</guid>
        <pubDate>Tue, 19 Jan 2021 09:32:37 +0000</pubDate>
        <title>twebbrowser - память и скорость работы</title>
        <link>https://forum.sources.ru/index.php?showtopic=421113&amp;view=findpost&amp;p=3843835</link>
        <description><![CDATA[noobofthenoobs: Здравствуйте. Мне периодически нужно распознавать пачки картинок (что на них изображено) Использую Яндекс.картинки для распознавания. Написал небольшой парсер - кинул на форму twebbrowser и пару memo - для входных ссылок и выходных слов.<br>
<br>
Примерно так:<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure TForm1.Button1Click(Sender: TObject); //запуск поиска</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;webbrowser1.Tag:=0;</div><div class="code_line">&nbsp;&nbsp; &nbsp;webbrowser1.Navigate(&#39;https://yandex.ru/images/search?source=collections&amp;rpt=imageview&amp;url=&#39;+memo1.Lines[0]); &nbsp; &nbsp; &nbsp; //ищем по первой ссылке</div><div class="code_line">end;</div></ol></div></div></div></div><script>preloadCodeButtons('1');</script><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;</div><div class="code_line">&nbsp;&nbsp;const pDisp: IDispatch; const URL: OleVariant);</div><div class="code_line">&nbsp;&nbsp;var doc:IHTMLDocument2;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;application.ProcessMessages;</div><div class="code_line">&nbsp;&nbsp; &nbsp;if ((pdisp as iwebbrowser)= (ASender as TWebBrowser).DefaultInterface) then &nbsp; &nbsp; //проверяем, что фрейм полностью загрузился</div><div class="code_line">&nbsp;&nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;(Asender as twebbrowser).defaultInterface.Document.QueryInterface(IHtmlDocument2,doc);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp;parse_yandex(doc.body.innerHTML, memo2); //передаю в функцию парсера html-текст и целевое memo</div><div class="code_line">&nbsp;&nbsp; &nbsp;(asender as Twebbrowser).tag:=(asender as Twebbrowser).tag+1; &nbsp; //tag показывает, какую по счету ссылку обрабатывает webbrowser</div><div class="code_line">&nbsp;&nbsp; &nbsp;if (asender as Twebbrowser).tag&#60;memo1.Lines.Count then &nbsp; &nbsp; &nbsp;//пока не дошли до конца, продолжаем искать по следующей ссылке</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp;(asender as Twebbrowser).Navigate(&#39;https://yandex.ru/images/search?source=collections&amp;rpt=imageview&amp;url=&#39;+memo1.Lines[(asender as Twebbrowser).tag])</div><div class="code_line">&nbsp;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">&nbsp;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
<div class='tag-code'><span class='pre_code'></span><div class='code  code_collapsed ' title='Подсветка синтаксиса доступна зарегистрированным участникам Форума.' style=''><div><div><ol type="1"><div class="code_line">procedure tform1.parse_yandex(curhtml:string;memo:tmemo);</div><div class="code_line">var</div><div class="code_line">st,m, count,mparsestart,mparseend,curline:integer;</div><div class="code_line">&nbsp;</div><div class="code_line">begin</div><div class="code_line">&nbsp;&nbsp; m:=1;</div><div class="code_line">&nbsp;&nbsp; count:=0;</div><div class="code_line">&nbsp;&nbsp; memo.Lines.add(&#39;&#39;);</div><div class="code_line">&nbsp;&nbsp; curline:=memo.Lines.Count-1;</div><div class="code_line">&nbsp;&nbsp; st:=pos(&#39;Кажется, на изображении&#39;,curhtml); //начало поиска</div><div class="code_line">&nbsp;&nbsp; while m&#62;0 do</div><div class="code_line">&nbsp;&nbsp; begin</div><div class="code_line">&nbsp;&nbsp; &nbsp;count:=count+1;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m:=posex(&#39;Button2-Text&#39;,curhtml,st);</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;if m&#62;0 then</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;begin</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mparsestart:=m+14; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //получаем начало слова</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;mparseend:=posex(&#39;/span&#39;,curhtml,mparsestart)-1; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //получаем конец слова</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;memo.lines.BeginUpdate;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;memo.Lines[curline]:=memo2.Lines[curline]+copy(curhtml,mparsestart,mparseend-mparsestart)+&#39; &#39;;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;memo.lines.endUpdate;</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;st:=mparseend; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //переходим к следующей выдаче.</div><div class="code_line">&nbsp;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; end;</div><div class="code_line">&nbsp;&nbsp; &nbsp; end;</div><div class="code_line">end;</div></ol></div></div></div></div><br>
<br>
Вроде как все работает, но есть пару моментов:<br>
<br>
- Можно ли как-то ускорить работу, не прибегая к многопоточности (я пробовал искать в нескольких потоках, но тогда периодически банят и нужно вводить капчи).<br>
- Программа по ходу поиска новых картинок отжирает все больше памяти. Допустим найти 64 штуки обходится в 800-900 Мб, а если около сотни то может и вылететь с ошибкой о том, что недостаточно памяти, когда используемая память достигает 1.3-1.4 Гб (при этом на компьютере 16гб).<br>
<br>
Что можете посоветовать? Реально ли что-то сделать с twebbrowser, чтобы он отжирал меньше памяти или тут без вариантов лучше использовать что-то другое?]]></description>
        <author>noobofthenoobs</author>
        <category>Delphi: Общие вопросы</category>
      </item>
	
      </channel>
      </rss>
	