Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли использовать TWebBrowser в потоке


Страницы:   1 2

ShimON ©   (2005-03-06 14:07:00) 

Вопрос для меня очень сложен, никак не могу понять в чем состоит запрет работы с VCL в потоке и что в конце концов является VCL. Вот, например, хочу воспользоваться TWebBrowser'ом как парсером в потоке, можно ли это сделать, и если можно то как. когда я пытаюсь в потоке сделать следущее
wb := TWebBrowser.Create(frmSettings);
 //TWinControl(wb).Name := 'MyWebBrowser';
 TWinControl(wb).Parent := frmSettings;
 wb.Visible:= False;

Уже на первой строке этого кода выдается ошибка: "Не произведен CoInitialize". Помогите, пожалуйста.


ShimoN   (2005-03-06 19:08:00) [1]

бесполезно


DrPass   (2005-03-06 19:05:00) [2]

:)
Я имел в виду, напиши ms.Position:=0 после того, как ты скачал в него страницу и перед тем, как ты загружаешь ее в TWebBrowser.


ShimON   (2005-03-06 18:36:00) [3]

нет, больше 1000


DrPass   (2005-03-06 18:25:00) [4]

ms.Position:=0?


ShimON   (2005-03-06 18:21:00) [5]

проходил, все идет правильно, а for i := 0 to ThiseWb.OleObject.Document.links.Length - 1 do
  if pos('sid=', ThiseWb.OleObject.Document.Links.Item(i)) <> 0 then
    begin
      sid:= ThiseWb.OleObject.Document.Links.Item(i);
      break;
    end;
не проходит. На сколько я понял, Document.links.Length = 0


DrPass   (2005-03-06 18:17:00) [6]


> В результате sid=''!!! Ничего не пойму!!! В чем же дело!!!

А отладчиком пройтись?


ShimON   (2005-03-06 16:15:00) [7]

Люди, ну помогите разобраться! Я не прошу готовых программ, мне хочется именно РАЗОБРАТЬСЯ. Так все-таки этот компанент - com-объект, значит он экспортирует какие-то функции, значит я могу ими пользоваться в отдельности?? Ничего не понимаю....


ShimON   (2005-03-06 16:01:00) [8]

А текст, который надо парсить, куда записывать??


Набережных С.   (2005-03-06 15:51:00) [9]


> ShimON ©   (06.03.05 15:43) [13]

Ну и зачем тебе этот TWebBrowser? Он интерфейсы использует? Факт. Вот и возьми те из них, которые тебе нужны, и работай с ними напрямую. И все ограничения VCL сразу отвалятся.


ShimON   (2005-03-06 15:43:00) [10]

Так ведь основное время выполняются операции скачки страниц Html


Набережных С.   (2005-03-06 15:40:00) [11]

На кой ляд нужен поток, который всю работу выполняет в Synchronize? Шоб было?


ShimON   (2005-03-06 15:25:00) [12]

Ничего не могу понять...
делаю так:
 type
   TConnectThread = class(TThread)
   private
     BProverka: boolean;
     ms: TMemoryStream;

   protected
     procedure Execute; override;
     procedure ReportRefresh;
     procedure GetSid;
     procedure GetInetOn;
   public
     property Proverka: boolean read BProverka write BProverka;
   end;

дальше код:
procedure TConnectThread.Execute;
var
 i: integer;
 ThiseWb: TWebBrowser;

begin
 if BProverka = True then
   begin
     CoInitialize(nil);
     ReportRefresh;
     CoUninitialize;
     Synchronize(RefreshIcon);
   end

Procedure TConnectThread.ReportRefresh;
var
 i,j: integer;
 s: string;
 Date: TSystemTime;
 DateBeg: TSystemTime;
 DateEn: TSystemTime;

begin
...
 ms:= TMemoryStream.Create;
 frmSettings.IEHTTP1.result_sl.SaveToStream(ms);
 Synchronize(GetSid);
...
end;

procedure TConnectThread.GetSid;
var
 ThiseWb: TWebBrowser;
 i: integer;

begin
 CreatWB(ThiseWb); // Эта процедура написана в первом сообщении
 WB_LoadHTML(ThiseWb, ms); // Процедура загрузки кода в TWebBrowser из стрима
 for i := 0 to ThiseWb.OleObject.Document.links.Length - 1 do
   if pos('sid=', ThiseWb.OleObject.Document.Links.Item(i)) <> 0 then
     begin
       sid:= ThiseWb.OleObject.Document.Links.Item(i);
       break;
     end;
 sid:= Copy(sid,Pos('sid=', sid)+4,28);
 ThiseWb.Free;
end;


В результате sid=''!!! Ничего не пойму!!! В чем же дело!!!


DrPass   (2005-03-06 15:16:00) [13]

Является. Можно просто работу с броузером оформить в виде отдельного метода у потомка TThread и вызывать его через TThread.Synchronize. Кроме того, в основном потоке CoInitialize/CoUninitialize вызовут без твоего участия


ShimON   (2005-03-06 14:38:00) [14]

Является ли решением переноса всей работы с броузером в основной поток??


DrPass   (2005-03-06 14:32:00) [15]

CoInitialize инициализирует библиотеки СОМ для текущего потока. Ее надо вызывать ровно один раз в потоке, который собрался работать с СОМ-объектами (TWebBrowser тоже из них).
CoUninitialize соответственно высвобождает все ресурсы, библиотеки и т.д., загруженные CoInitialize. Вызывать - так же один раз, по окончании работы потока.
Но все равно, это тебя не избавит от потенциальных глюков, связанных с VCL


ShimON   (2005-03-06 14:23:00) [16]

Объясните, пожалуйста, что делают эти функции, в какой момент должны вызываться и сколько раз, если я это все в поток хочу засунуть...


DrPass   (2005-03-06 14:19:00) [17]

uses ActiveX;
CoInitialize(nil);
...
CoUninitialize;


ShimON   (2005-03-06 14:14:00) [18]

CoInitialize(wb); - компилятор выдает - неизвесная процедура, а в хелпе ничего по поводу нее нет


DrPass   (2005-03-06 14:11:00) [19]


> Нет у него такой функции :((

CoInitialize - это не у TWebBrowser. Это обычная процедура


DrPass   (2005-03-06 14:10:00) [20]


> в чем состоит запрет работы с VCL в потоке

Если в двух словах, то есть глобальные объекты, к которым обращаются компоненты. При многопоточной работе могут быть (и наверняка будут) коллизии.

> воспользоваться TWebBrowser'ом как парсером в потоке, можно
> ли это сделать

Ту часть, которая "парсит", вынеси в основной поток. Можно с помощью Synchronize


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо