Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2011.08.28;
Скачать: [xml.tar.bz2];

Вниз

Проблема WebBrowser1.Navigate()   Найти похожие ветки 

 
mm0   (2009-04-21 04:51) [0]

Вызываю метод Navigate() через поток в процессе.
Если на компе стоит InternetExplorer 6 - то проблем нет.
А если InternetExplorer 7 - то возникает ошибка:
" Не удается найти "www.yandex.ru". Проверте правильность пути или адреса в Интернете."
Это происходит вне зависимости подключен ты к Интернету или нет.
Вызов метода Navigate из процесса,что в IE 6, что в IE 7, такой ошибки не вызывает.
Delphi7/Windows XP.

Уважаемые мастара помогите решить проблему.
Как сделать чтобы в потоке это работало?

Код:

unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, OleCtrls, SHDocVw;

type
 TForm1 = class(TForm)
   WebBrowser1: TWebBrowser;
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
   procedure Button2Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
   ThreadHandleCore,thid:LongWord;
 end;

var
 Form1: TForm1;
const
 Url:WideString="www.yandex.ru";

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 WebBrowser1.Navigate(Url);
end;

procedure GetPicThread;
var ec:LongWord;
begin
 Form1.WebBrowser1.Navigate(Url);  // ВО ВРЕМЯ ВЫПОЛНЕНИЯ ВЫСКАКИВАЕТ ОШИБКА!!!!!!!!!!!!!!!!!!!!!!
 Sleep(3000);
 GetExitCodeThread(Form1.ThreadHandleCore,ec);
 ExitThread(ec);
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 ThreadHandleCore:=CreateThread(nil,0,@GetPicThread,nil,0,thid);
end;

end.


 
Сергей М. ©   (2009-04-21 09:23) [1]

Очень плохой код. Грабли на граблях.

Так использовать доп.поток нельзя, тем более в этом потоке осуществляется работа с TWebBrowser.

Начни с чтения справки к ф-ции BeginThread(), исправляй основные ошибки - потом продолжим.


 
mm0   (2009-04-21 12:26) [2]

Преимущество в использовании Delphi функции BeginThread от WinAPI функции CreateThread состоит в том, что порождая новый поток функция BeginThread устанавливает значение глобальной переменной IsMultiThread в True, что в свою очередь обеспечивает безопасное использование динамической памяти (в то время когда один поток управляет памятью, доступ к диспетчеру памяти для другого потока будет заблокирован до того момента, пока первый поток не освободит диспетчер памяти).

Попробывал BeginThread. Пологаю из-за  "доступ к диспетчеру памяти для другого потока будет заблокирован" сейчас вдобавок начинают сыпатся ошибки OleObject.


 
Сергей М. ©   (2009-04-21 13:44) [3]


> Попробывал BeginThread


ПробЫвал - показывай)..
Я что, телепатировать должен что ты там "напробывал" ?


 
mm0   (2009-04-21 14:43) [4]

Посмотрел модуль SHDocVw, там вообще в процедуру Navigate передается переменная, которая записывается в стек и от туда потом берутся данные:
procedure Navigate(const URL: WideString); overload;
У меня она(Url) константа, другие процедуры ее пока не меняют.
И зачем тут нужно "безопасное использование динамической памяти"
несовсем понимаю...

Как использовал?
Переписал процедуру Button2Click и все:

procedure TForm1.Button2Click(Sender: TObject);
begin
 ThreadHandleCore:=BeginThread(nil,0,@GetPicThread,nil,0,thid);
end;


 
Сергей М. ©   (2009-04-21 14:56) [5]


> Переписал процедуру Button2Click и все


Маллацца)

А теперь читай, например, вот это

http://stackoverflow.com/questions/638825/delphi-twebbrowser-in-background-thread

до полного просветления.


 
mm0   (2009-04-21 16:15) [6]

Читал....

"Is it possible to load a webpage in a TWebBrowser in a background thread?

When the application loads, I want to download a page from the web into a TWebBrowser, but I don"t want to block the gui-thread."

Answer:
...
WebBrowser1.Navigate(...);
while WebBrowser1.Busy do
 Application.ProcessMessages;
...
...That uses ProcessMessages, so I cannot in good faith recommend it. To be notified when the download is complete, instead of polling like that code does, handle the control"s OnNavigateComplete2 event. Beware that the event may be fired for frames as well as the main page...


Пошли куда-то в сторону.В главном процессе это я знал как сделать.
Мне нужно иммено, чтобы в потоке вызывался метод Navigate.
А тут это долбаная ошибка..


 
Сергей М. ©   (2009-04-21 16:34) [7]


> Читал....


> нужно иммено, чтобы в потоке вызывался метод Navigate


Похоже что не читал, а знакомые буквы там искал)

TWebBrowser already downloads stuff in a separate thread. Your program should already remain responsive while it"s downloading

Вник ?
Вопос: зачем тебе нужно выносить работу с браузером в доп.поток, если браузер и так уже делает свою работу асинхронно ?


 
Сергей М. ©   (2009-04-21 17:21) [8]

Ну и самое важное, что тебе следовало уяснить из прочитанного:

If you want to display the page, then your TWebBrowser control should not be in a separate thread anyway because it falls under the same rules as any other control used with the VCL. If you"re just using the control to download a page, then TWebBrowser might be overkill. You could use Indy, or the operating system"s built-in file-downloading functions. Those can be used in separate threads easily.


 
mm0   (2009-04-22 06:00) [9]

Помогите исправить ошибку памяти, а не учите "так не делают".
У меня специфическая задача, где иммено в потоке должен быть Navigate.А что так не делают, это везде пишут.
Вообще интересно почему IE6 не ругается и у меня все работает,а IE  7 - ругается.
что они такого там дописали в нем и как бы это обойти?


 
Сергей М. ©   (2009-04-22 08:17) [10]

Navigate - асинхронный метод.

Где у тебя в доп.потоке цикл ожидания/выборки/диспетчеризации оконных сообщений ?

Где у тебя в доп.потоке инициализация/финализация OLE ?

Где, в конце-концов, элементарная обработка исключений ?

Нет этого ничего ..

Вот это и есть специфика)


 
mm0   (2009-04-25 15:09) [11]

Где у тебя в доп.потоке цикл ожидания/выборки/диспетчеризации оконных сообщений ? Где у тебя в доп.потоке инициализация/финализация OLE ? -  зачем он нужен. Объект WebBrowser1 инициализирован в главной форме по созданию. В главной форме и производится диспечерезация оконных сообщений, инициализация, а также финализация OLE при вызове Form1.Destroy(Free).

Элементарная обработка исключений, ну не дедал я ее, она мне не нужна была для примера.


 
Сергей М. ©   (2009-04-25 19:50) [12]

Забудь про свои главные формы !
Доп.поток НИКОИМ образом не должен касаться форм.


 
mm0   (2009-05-01 05:04) [13]

Хорошо. Отдельно в потоке.
Попробывал. Не работает. Как эту Инициализацио Ole зделать

procedure GetPicThread;
var ec:LongWord;
   WebBrowserL:TWebBrowser;
begin
 WebBrowserL:=TWebBrowser.Create(@GetPicThread);
 WebBrowserL.Navigate(Url);
 Sleep(3000);
 WebBrowserL.Destroy;
 GetExitCodeThread(Form1.ThreadHandleCore,ec);
 ExitThread(ec);
end;


 
Сергей М. ©   (2009-05-01 14:19) [14]

begin
 CoInitialize(nil);
try
 .. здесь работа с олей ..
finally
 CoUninitialize;
end;
end;


> Sleep(3000);


Это еще зачем ?

Нужен цикл ожидания/выборки/диспетчеризации оконных сообщений, а не sleep



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

Форум: "Сети";
Текущий архив: 2011.08.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.003 c
15-1304595679
И. Павел
2011-05-05 15:41
2011.08.28
чтение системных журналов сообщений


15-1304627395
Юрий
2011-05-06 00:29
2011.08.28
С днем рождения ! 6 мая 2011 пятница


15-1304428882
Дмитрий С
2011-05-03 17:21
2011.08.28
Как вы относитесь к работе, которой сами руководите?


1-1264839776
kudatsky
2010-01-30 11:22
2011.08.28
Как скопировать слово из одного TMemo в другой ?


15-1304972992
Юрий
2011-05-10 00:29
2011.08.28
С днем рождения ! 10 мая 2011 вторник





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский