![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли использовать TWebBrowser в потоке
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не проходит. На сколько я понял, Document.links.Length = 0
if pos('sid=', ThiseWb.OleObject.Document.Links.Item(i)) <> 0 then
begin
sid:= ThiseWb.OleObject.Document.Links.Item(i);
break;
end;
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