Форум: "Основная";
Текущий архив: 2005.03.20;
Скачать: [xml.tar.bz2];
ВнизМожно ли использовать 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);
endProcedure 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
не проходит. На сколько я понял, 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: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;
Скачать: [xml.tar.bz2];
Память: 0.5 MB
Время: 0.033 c