WebBrowser, Navigate, OnNavigate...
От: kuj  
Дата: 12.05.04 18:43
Оценка:
Метод Navigate (Navigate2) у WebBrowser, как известно, ассинхронный. Если в одном и том же приложении для второго созданного объекта WebBrowser вызвать Navigate до того, как закончится Navigate первого, вылетит exception с сообщением "can not invoke method Navigate at this time".
Ладно, не может так не может. Вызов Navigate переносим в новый поток. Создаем объект ядра auto reset event. В OnNavigate сбрасываем его в "свободно". Непосредственно перед Navigate — "занято", непосредственно перед "занято" ждем освобождения. Казалось бы, все должно работать, но не тут-то было — OnNavigate срабатывает, event переводится в "свободно", ожидающий поток перевод event в "занято", вызывает Navigate.. и снова вылетает вышеупомянутый эксепшин.

Господа, подскажите, пожалуйста, как его побороть?
... << RSDN@Home 1.1.3 stable >>
Re: WebBrowser, Navigate, OnNavigate...
От: kliff Россия http://www.esignal.ru
Дата: 12.05.04 19:10
Оценка:
Здравствуйте, kuj, Вы писали:


kuj>Метод Navigate (Navigate2) у WebBrowser, как известно, ассинхронный. Если в одном и том же приложении для второго созданного объекта WebBrowser вызвать Navigate до того, как закончится Navigate первого, вылетит exception с сообщением "can not invoke method Navigate at this time".

kuj>Ладно, не может так не может. Вызов Navigate переносим в новый поток. Создаем объект ядра auto reset event. В OnNavigate сбрасываем его в "свободно". Непосредственно перед Navigate — "занято", непосредственно перед "занято" ждем освобождения. Казалось бы, все должно работать, но не тут-то было — OnNavigate срабатывает, event переводится в "свободно", ожидающий поток перевод event в "занято", вызывает Navigate.. и снова вылетает вышеупомянутый эксепшин.

kuj>Господа, подскажите, пожалуйста, как его побороть?


Определяешь свой мессадж и шлешь его PostMessage (а в обработчике вызываешь Navigate).
Re[2]: WebBrowser, Navigate, OnNavigate...
От: kuj  
Дата: 12.05.04 20:14
Оценка:
Здравствуйте, kliff, Вы писали:

kuj>>Метод Navigate (Navigate2) у WebBrowser, как известно, ассинхронный. Если в одном и том же приложении для второго созданного объекта WebBrowser вызвать Navigate до того, как закончится Navigate первого, вылетит exception с сообщением "can not invoke method Navigate at this time".

kuj>>Ладно, не может так не может. Вызов Navigate переносим в новый поток. Создаем объект ядра auto reset event. В OnNavigate сбрасываем его в "свободно". Непосредственно перед Navigate — "занято", непосредственно перед "занято" ждем освобождения. Казалось бы, все должно работать, но не тут-то было — OnNavigate срабатывает, event переводится в "свободно", ожидающий поток перевод event в "занято", вызывает Navigate.. и снова вылетает вышеупомянутый эксепшин.

kuj>>Господа, подскажите, пожалуйста, как его побороть?


K>Определяешь свой мессадж и шлешь его PostMessage (а в обработчике вызываешь Navigate).

Не совсем понимаю как это может помочь? Navigate ведь ассинхронный. Все, что мне нужно — это момент, когда Navigate уже можно вызывать. Казалось бы, OnNavigate должен сигнализировать именно об этом моменте, но он этого почему-то не делает...
... << RSDN@Home 1.1.3 stable >>
Re[3]: WebBrowser, Navigate, OnNavigate...
От: kuj  
Дата: 12.05.04 20:24
Оценка:
Здравствуйте, kuj, Вы писали:

kuj>Не совсем понимаю как это может помочь? Navigate ведь ассинхронный. Все, что мне нужно — это момент, когда Navigate уже можно вызывать. Казалось бы, OnNavigate должен сигнализировать именно об этом моменте, но он этого почему-то не делает...

Поправка: речь о событии NavigateComplete2.
... << RSDN@Home 1.1.3 stable >>
Re[4]: WebBrowser, Navigate, OnNavigate...
От: algol Россия about:blank
Дата: 13.05.04 06:53
Оценка:
Здравствуйте, kuj, Вы писали:

kuj>Здравствуйте, kuj, Вы писали:


kuj>>Не совсем понимаю как это может помочь? Navigate ведь ассинхронный. Все, что мне нужно — это момент, когда Navigate уже можно вызывать. Казалось бы, OnNavigate должен сигнализировать именно об этом моменте, но он этого почему-то не делает...

kuj>Поправка: речь о событии NavigateComplete2.

Попробуй DownloadComplete — "Fires when a navigation operation finishes, is halted, or fails".
Re[5]: WebBrowser, Navigate, OnNavigate...
От: kuj  
Дата: 13.05.04 13:46
Оценка:
Здравствуйте, algol, Вы писали:

kuj>>>Не совсем понимаю как это может помочь? Navigate ведь ассинхронный. Все, что мне нужно — это момент, когда Navigate уже можно вызывать. Казалось бы, OnNavigate должен сигнализировать именно об этом моменте, но он этого почему-то не делает...

kuj>>Поправка: речь о событии NavigateComplete2.

A>Попробуй DownloadComplete — "Fires when a navigation operation finishes, is halted, or fails".

Пробовал. Все аналогично.
... << RSDN@Home 1.1.3 stable >>
Re: WebBrowser, Navigate, OnNavigate...
От: Nikto Россия  
Дата: 16.05.04 10:17
Оценка:
Здравствуйте, kuj, Вы писали:


kuj>Метод Navigate (Navigate2) у WebBrowser, как известно, ассинхронный. Если в одном и том же приложении для второго созданного объекта WebBrowser вызвать Navigate до того, как закончится Navigate первого, вылетит exception с сообщением "can not invoke method Navigate at this time".

kuj>Ладно, не может так не может. Вызов Navigate переносим в новый поток. Создаем объект ядра auto reset event. В OnNavigate сбрасываем его в "свободно". Непосредственно перед Navigate — "занято", непосредственно перед "занято" ждем освобождения. Казалось бы, все должно работать, но не тут-то было — OnNavigate срабатывает, event переводится в "свободно", ожидающий поток перевод event в "занято", вызывает Navigate.. и снова вылетает вышеупомянутый эксепшин.

kuj>Господа, подскажите, пожалуйста, как его побороть?


Что-то вообще фигня какая-то. Можно вызывать навигэйт сколько угодно раз у одного, двух... контролов. Ничего не надо дожидаться.
Скорей всего какая-то ошибка в создании компонента.
Re[2]: WebBrowser, Navigate, OnNavigate...
От: kuj  
Дата: 16.05.04 15:49
Оценка:
Здравствуйте, Nikto, Вы писали:

kuj>>Метод Navigate (Navigate2) у WebBrowser, как известно, ассинхронный. Если в одном и том же приложении для второго созданного объекта WebBrowser вызвать Navigate до того, как закончится Navigate первого, вылетит exception с сообщением "can not invoke method Navigate at this time".

kuj>>Ладно, не может так не может. Вызов Navigate переносим в новый поток. Создаем объект ядра auto reset event. В OnNavigate сбрасываем его в "свободно". Непосредственно перед Navigate — "занято", непосредственно перед "занято" ждем освобождения. Казалось бы, все должно работать, но не тут-то было — OnNavigate срабатывает, event переводится в "свободно", ожидающий поток перевод event в "занято", вызывает Navigate.. и снова вылетает вышеупомянутый эксепшин.

kuj>>Господа, подскажите, пожалуйста, как его побороть?


N>Что-то вообще фигня какая-то. Можно вызывать навигэйт сколько угодно раз у одного, двух... контролов. Ничего не надо дожидаться.

N>Скорей всего какая-то ошибка в создании компонента.

У одного ладно, понятно — предыдущий Navigate просто останавливается и запускается новый, скорее всего. А вот у двух и более Navigate одновременно работать отказывается. Ошибка в создании маловероятна. Клиент работает через Interop. Но тоже самое наблюдается с клиентом на MFC.
... << RSDN@Home 1.1.3 stable >>
Re[3]: WebBrowser, Navigate, OnNavigate...
От: Nikto Россия  
Дата: 17.05.04 03:10
Оценка:
Здравствуйте, kuj, Вы писали:

N>>Что-то вообще фигня какая-то. Можно вызывать навигэйт сколько угодно раз у одного, двух... контролов. Ничего не надо дожидаться.

N>>Скорей всего какая-то ошибка в создании компонента.

kuj>У одного ладно, понятно — предыдущий Navigate просто останавливается и запускается новый, скорее всего. А вот у двух и более Navigate одновременно работать отказывается. Ошибка в создании маловероятна. Клиент работает через Interop. Но тоже самое наблюдается с клиентом на MFC.


Гадом буду , но у меня на 4-х вызывается .Одновременно. Только что сваял пример. Могу по мылу заслать( если оставишь конечно ).
Re[4]: WebBrowser, Navigate, OnNavigate...
От: boris_oleinic  
Дата: 12.10.05 14:28
Оценка:
N>Гадом буду , но у меня на 4-х вызывается .Одновременно.
N>Только что сваял пример. Могу по мылу заслать( если оставишь конечно ).

у меня тоже трудности были с вызовом Navigate2 в случайный момент времени
обойти это удалось только так:


try
{
    VARIANT_BOOL vbBusy;
    HRESULT hr = pThrData->spWebBrowser2->get_Busy(&vbBusy);
    if( (!FAILED(hr)) && (vbBusy == VARIANT_TRUE) )
    {
    } // if(FAILED(hr) || (vbBusy == VARIANT_TRUE) )
    else if(FAILED(hr))
    {
    } // else if(FAILED(hr))
    else
    {
        HRESULT hr = pThrData->spWebBrowser2->Navigate2(&varNewURL,NULL,NULL,NULL,NULL);
        if(FAILED(hr))
        {
        } // if(FAILED(hr))
} catch(...) {}


при чем try — catch очень полезная штука !
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.