Functie die te lang bezig is afbreken

Status
Niet open voor verdere reacties.

famlam

Gebruiker
Lid geworden
15 okt 2008
Berichten
416
Is het mogelijk om een functie af te breken en false te laten retourneren als deze langer dan 2000 ms bezig is?

Stel ik heb een functie die soms erg lang bezig is met een controle van iets. Als deze controle langer dan 2 seconde duurt dan moet deze worden afgebroken en moet 'False' geretourneerd worden. Hoe doe ik dit?

Ik kan nog geen code posten omdat ik eerst wil weten of zoiets mogelijk is voordat ik eraan begin.
 
Je zou een boolean kunnen maken en aan het einde van de functie die boolean kunnen veranderen en met een timer kijken of die boolean die waarde heeft. Zo niet, aborten. Alleen weet ik niet hoe je een functie stopt.

Edit: Als de controle bestaat uit meerdere regels, kun je tussen elke regel een IFje tussen plaatsen en kijken of die boolean die waarde heeft. Als dat zo is, Return (ofzoiets). Voor een controle die bestaat uit één regel kan ik helaas geen oplossing bedenken. Misschien iemand anders?
 
Laatst bewerkt:
Je zou een boolean kunnen maken en aan het einde van de functie die boolean kunnen veranderen en met een timer kijken of die boolean die waarde heeft. Zo niet, aborten. Alleen weet ik niet hoe je een functie stopt.

Edit: Als de controle bestaat uit meerdere regels, kun je tussen elke regel een IFje tussen plaatsen en kijken of die boolean die waarde heeft. Als dat zo is, Return (ofzoiets). Voor een controle die bestaat uit één regel kan ik helaas geen oplossing bedenken. Misschien iemand anders?

Waarschijnlijk zullen alle regels op één na heel snel zijn. Dit komt er dus op neer dat het eigenlijk maar één regel is waar het om gaat.

Een mooi voorbeeld waarin dit ook voorkomt is die voor internetverbindingscontrole:
Code:
    Private Function IsConnectieBeschikbaar() As Boolean
        Debug.Print(Now.TimeOfDay.Seconds + Now.TimeOfDay.Milliseconds / 1000)
        If My.Computer.Network.IsAvailable = False Then Return False
        Debug.Print(Now.TimeOfDay.Seconds + Now.TimeOfDay.Milliseconds / 1000)
        Dim link As New System.Uri("http://www.google.nl/")
        Debug.Print(Now.TimeOfDay.Seconds + Now.TimeOfDay.Milliseconds / 1000)
        Dim WebAanvraag As System.Net.WebRequest = System.Net.WebRequest.Create(link)
        Debug.Print(Now.TimeOfDay.Seconds + Now.TimeOfDay.Milliseconds / 1000)
        Dim WebReactie As System.Net.WebResponse
        Debug.Print(Now.TimeOfDay.Seconds + Now.TimeOfDay.Milliseconds / 1000)
        Try
            Debug.Print(Now.TimeOfDay.Seconds + Now.TimeOfDay.Milliseconds / 1000)
            [B]WebReactie = WebAanvraag.GetResponse()[/B]
            Debug.Print(Now.TimeOfDay.Seconds + Now.TimeOfDay.Milliseconds / 1000)
            WebReactie.Close()
            Debug.Print(Now.TimeOfDay.Seconds + Now.TimeOfDay.Milliseconds / 1000)
            WebAanvraag = Nothing
            Debug.Print(Now.TimeOfDay.Seconds + Now.TimeOfDay.Milliseconds / 1000)
            Return True
        Catch WebEx As Net.WebException
            WebAanvraag = Nothing
            Return False
        End Try
    End Function
Debug output zei:
13,832
13,938
13,939
13,965
13,966
13,967
16,332
16,337
16,338
Als je de debug-output ziet van deze dan zie je dat er maar één regel veel tijd kost en dat de anderen heel snel zijn. ALS dit de code zou zijn waar het over gaat (dat is het niet, maar als voorbeeld, het effect zal ongeveer hetzelfde zijn), dan zou die ene regel (dikgedrukt) de regel zijn waarin die abort zou moeten plaatsvinden. Die andere zijn te verwaarlozen (met 0.1 seconde tijdsverschil maximaal).
 
Laatst bewerkt:
Je kunt toch aan het begin van de functie de tijd onthouden in een aparte variabele?
B.v. TimeFunctionStarted = Now
En dan naderhand afvragen of Now - TimeFunctionStarted > 2000?

Hoe de code er exact uitziet weet ik even niet uit mijn hoofd
 
Laatst bewerkt:
Je kunt toch aan het begin van de functie de tijd onthouden in een aparte variabele?
B.v. TimeFunctionStarted = Now
En dan naderhand afvragen of Now - TimeFunctionStarted > 2000?

Hoe de code er exact uitziet weet ik even niet uit mijn hoofd

De code moet worden AFGEBROKEN na 2000 seconden, en er moet dus niet achteraf gekeken worden of het tijdsverschil > 2000, maar TIJDENS de code.
 
Snap ik wel, maar
Code:
        If Now - TimeFunctionStarted > 2000 Then
            Exit Sub
        End If
kan dan toch gewoon tussen je code worden neergezet?
Of misschien snap ik iets niet
 
Snap ik wel, maar
Code:
        If Now - TimeFunctionStarted > 2000 Then
            Exit Sub
        End If
kan dan toch gewoon tussen je code worden neergezet?
Of misschien snap ik iets niet

Stel ik heb 3 regels code. Regel_1 duurt 10 ms, regel_2 duurt 10000ms en regel_3 duurt 28ms.
Als ik dan zet

Code:
     0ms
Regel_1
     10ms
TimeFunctionStarted = now()
     10ms
Regel_2
     10010ms
If Now - TimeFunctionStarted > 2000 Then Exit Sub
     10010ms
Regel_3
     10038ms

Dan is de code toch 10010ms bezig. Ik zoek iets dat hem op 2000ms automatisch afbreekt/false laat returnen.
 
idee :

Thread starten en daar met een delegate controleren of die 2 seconden al voorbij zijn. zo ja dan thread afbreken.
 
Status
Niet open voor verdere reacties.

Nieuwste berichten

Terug
Bovenaan Onderaan