Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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);
   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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.033 c
8-1101646742
serko
2004-11-28 15:59
2005.03.20
Line in-->Microphone


3-1108895395
DelphiN!
2005-02-20 13:29
2005.03.20
Сохранение записи в БД ФБ


3-1108805188
Bogdan
2005-02-19 12:26
2005.03.20
Как програмно вставить DBGrid?


3-1108632950
Gost
2005-02-17 12:35
2005.03.20
Можна ли одним махом обрезать полтаблицы?


8-1098098766
_Дельфин_
2004-10-18 15:26
2005.03.20
GIF в проекте





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский