![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Несколько WebBrouserофф
guru-ru © (2006-03-31 09:38:00)Есть пробемка. Вот у меня есть процедура
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin
//IsFirst Логическая
if IsFirst then
begin
webbrowser1.Navigate(listbox1.items.strings[x]);
x:=x+1;
// эти 2 строчки проблемные, т.к. после вызова первой другой браузер может
//также выполнить ее и в итоге разные браузеры загрузят одну и туже
//строку и потом только пойдет увеличение х:=х+1
isfirst:=false;
end
Else
begin
memo1.lines.add(' А вот сюды мне нужно передать страницу, которую именно этот браузер грузил!!!');
IsFirst:=true;
end;
end;
затем у меня динамически создается 10 экземпляров браузеров и вот первый вопрос
как мне вновь созданым браузерам назначить эту процедуру
2)После назанчиения появятся проблемы обозначенные в коментариях
3)Можно как-то с помощью браузера получить код-ответ (400 NotFound, 200 Ok,.....)
guru-ru (2006-03-31 17:20:00) [1]буду думать. спасибо за помощь. а насчет вопроса о получении ответа (404,403,200) можно получить их из браузера? или какнить определить, доступна страница или нет.
Сергей М. (2006-03-31 16:52:00) [2]Еще раз - пересматривай логику.
Она у тебя расчитана скорей на синхронность, нежели на асинхронность неких вызовов.
Событие OnDocumentComplete говорит тебе об успешной загрузке документа таким-то конкретнымбраузером.
Я не вижу трудностей в организации некоего менеджера, который в ответ на извещение неким браузером о факте загрузки им текущего док-та даст этому браузеру очередной URL из некоего списка.
guru-ru (2006-03-31 16:31:00) [3]ну если сразу 10 асинхронных браузера работает это разве уже не многопоточность? конечно не в прямом смысле, но всеже...
Сергей М. (2006-03-31 15:04:00) [4]critical sections
но использовать их в однопоточном приложении как минимум не разумно
guru-ru (2006-03-31 14:30:00) [5]Таг не поможет, ведь эти гады так и будут выбирать Х в произвольном порядке. Во жопа. а нет ничего чтобы создать защищеный участок кода?
Сергей М. (2006-03-31 13:29:00) [6]Есть.
Полностью пересмотреть логику приложения.
И "сокеты" здесь ни при чем - транспортный уровень здесь тебе не доступен.
Возьми, например, да пропиши каждому экз-ру браузера в св-ве Tag нужное значение индекса.
guru-ru (2006-03-31 13:16:00) [7]Х считает какой элемент из списка нужно взять. А то что асинхронный я знаю. но думал, что может можно как в сокетах сделать блокирующий режим.
Есть предложения?
Сергей М. (2006-03-31 12:59:00) [8]
> guru-ru (31.03.06 12:46) [2]
Такой подход изначально неверный.
Navigate() - это асинхронныйметод.
Успешный его вызов не означает полное выполнение запроса, при этом указанный запрос лишь запускается на выполнение в фоне.
Объясни смысл и назначение переменной X ..
guru-ru (2006-03-31 12:46:00) [9]Спасибо, а как насчет
webbrowser1.Navigate(listbox1.items.strings[x]);
x:=x+1;
можно както показать программе что эти 2 строчки разделять нельзя, нужно их выполнять в паре, не выделяя время другим процессам
Сергей М. (2006-03-31 10:53:00) [10]
> как мне вновь созданым браузерам назначить эту процедуру
procedure TForm1.WebBrowserDocumentComplete(Sender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var Browser: TWebBrowser;
begin
Browser := Sender as TWebBrowser;
.. работаем с Browser ..
end;
...
for i:= 0 to 9 do
begin
Browsers[i] := TWebBrowser.Create(...);
Browsers[i].OnComplete := WebBrowserDocumentComplete;
end;