Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.03.20;
Скачать: CL | DM;

Вниз

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

 
ShimON ©   (2005-03-06 14:07) [0]

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

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


 
Anatoly Podgoretsky ©   (2005-03-06 14:09) [1]

Так последуй накконец инструкции, для чего тебе ее система выдала, чтобы исполнял. Проведи CoInitialize


 
ShimON ©   (2005-03-06 14:10) [2]

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


 
DrPass ©   (2005-03-06 14:10) [3]


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

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

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

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


 
DrPass ©   (2005-03-06 14:11) [4]


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

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


 
ShimON ©   (2005-03-06 14:14) [5]

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


 
DrPass ©   (2005-03-06 14:19) [6]

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


 
ShimON ©   (2005-03-06 14:23) [7]

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


 
DrPass ©   (2005-03-06 14:32) [8]

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


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

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


 
DrPass ©   (2005-03-06 15:16) [10]

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


 
ShimON ©   (2005-03-06 15:25) [11]

Ничего не могу понять...
делаю так:
 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=""!!! Ничего не пойму!!! В чем же дело!!!


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

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


 
ShimON ©   (2005-03-06 15:43) [13]

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


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


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

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


 
ShimON ©   (2005-03-06 16:01) [15]

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


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

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


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


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

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


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

проходил, все идет правильно, а 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:25) [19]

ms.Position:=0?


 
ShimON ©   (2005-03-06 18:36) [20]

нет, больше 1000


 
DrPass ©   (2005-03-06 19:05) [21]

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


 
ShimoN ©   (2005-03-06 19:08) [22]

бесполезно



Страницы: 1 вся ветка

Текущий архив: 2005.03.20;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.025 c
11-1093028459
VNavigator
2004-08-20 23:00
2005.03.20
Масштабирование изображения с помощью PBitmap


1-1110296519
rolex
2005-03-08 18:41
2005.03.20
Как сделать чтобы в ListView изменяла ширину только 1я колонка?


6-1105978696
CBOLOCH
2005-01-17 19:18
2005.03.20
Отловить новую сессию


3-1108713884
Sour
2005-02-18 11:04
2005.03.20
В триггере узнать какие поля обновились


3-1108621131
Sour
2005-02-17 09:18
2005.03.20
Можно ли в условии запроса использовать хранимую процедуру