Как пропустить часть кода, когда загрузка занимает слишком много времени

Кто-то ответил на мой вопрос для Java, и я в основном использую предыдущий ответ, предоставленный @enderland, здесь.

Я использую веб-браузер, и в целом он работает хорошо, но я часто сталкиваюсь с «ошибками времени выполнения». Я хочу избежать этого, пропустив конкретное задание (в моем случае загрузка страницы патента в Google), если время, необходимое для загрузки веб-сайта, занимает слишком много времени.

Я считаю, что простой If Then - это то, что мне нужно, но я не знаю, какую функцию использовать для управления истечением времени.

Какие-либо предложения?

На данный момент я запускаю следующее:

Function citecount(patent_number As String, patent As String, ccount As Integer, info As String)

patent = ""
ccount = 0
If patent_number = "" Then Exit Function

the_start:


Set ie = CreateObject("InternetExplorer.Application")

    ie.Top = 0
    ie.Left = 0
    ie.Width = 800
    ie.Height = 600
    ie.Visible = False 'If False we won't see the window navigation

On Error Resume Next
     ie.Navigate ("http://www.google.com/patents/US" & patent_number & "?")
        Sleep (600)
      Do
        DoEvents
            If Err.Number <> 0 Then
                ie.Quit
                Set ie = Nothing
                GoTo the_start:
            End If
           Sleep (1250)

        Loop Until ie.ReadyState = 4

При этом Sleep() определяется как:

Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)

Основная ошибка, с которой я сталкиваюсь, описана здесь . Это Run-time error '2147467259 (80004005) automation error, unspecified error. Кроме того, до того, как я добавил команды Sleep(), я также получил Microsoft Excel is waiting for another Application to complete an on OLE action, но он не вернулся с момента добавления команды Sleep().

Наконец я получаю предупреждение IE:

Stop running this script? A Script on thispage is causing your web browser to run slowly. If it continues to run your computer might become unresponsive

Я думаю, все это вызвано тем фактом, что веб-страница занимает много времени, загружая изображения, которые мне не нужны. Я прочитал несколько сообщений о загрузке веб-страницы непосредственно в html без изображений на SO, но не смог найти тот, который я мог бы реализовать (новичок на работе).

Надеюсь, это даст разъяснения


person SJDS    schedule 29.05.2014    source источник
comment
Какие ошибки во время выполнения? Кроме того, можете ли вы опубликовать больше своего кода? Ваш текущий блок If Err.Number... (если это все, что есть) никогда не перехватит ошибку, если перед ней не будет On Error Resume Next.   -  person David Zemens    schedule 29.05.2014


Ответы (1)


Я думаю, вы можете переосмыслить, как вы используете IE / свой код для решения вашей проблемы в целом. Если вы действительно хотите использовать тайм-аут для пропуска вызовов IE, вы можете сделать следующее.

Используйте эту функцию, чтобы узнать время, прошедшее между двумя датами:

Function ElapsedTimeInSeconds(endTime As Date, startTime As Date) As Long
    ' Calculate the time interval in seconds
    If endTime > startTime Then
        ElapsedTimeInSeconds = DateDiff("s", startTime, endTime)
    Else
        ElapsedTimeInSeconds = 0 ' cannot have negative elapsed time...
    End If
End Function

Измените свой цикл do Loop, чтобы учесть это

Dim startTime As Date: startTime = Now
Dim timeout As Long: timeout = 5  'seconds
Do
    DoEvents
    If Err.Number <> 0 Then
        ie.Quit
        Set ie = Nothing
        GoTo the_start:
    End If
    Sleep (1250)
Loop Until ie.ReadyState = 4 Or ElapsedTimeInSeconds(Now, startTime) > timeout

ИЛИ вы можете захотеть поиграть с функцией ElapsTimeInSeconds (), чтобы вернуться к "_start", в зависимости от того, как остальная часть вашего кода структурирована.

person rex    schedule 29.05.2014
comment
Спасибо, Армен, я реализовал ваше решение, которое работало довольно хорошо, особенно когда я понял, что могу заблокировать отображение изображений в IE с помощью некоторых дополнительных настроек. Однако я все еще получаю описанную ранее ошибку времени выполнения (stackoverflow.com/questions/23818004/), что в основном не позволяет мне запускать код в ночное время, потому что он выходит из строя каждые 10-15 минут. Вы упомянули другой подход к решению моей проблемы. Можете ли вы подсказать, как это могло бы работать более эффективно и результативно? - person SJDS; 04.06.2014