Форум: "Сети";
Текущий архив: 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