PDA

View Full Version : [VB] Realizzare un timeout, come?


Matrixbob
22-05-2009, 10:56
Esegui questa istruzione in tot tempo, altrimenti esci o continua.

Cosa si puō usare per esprimere questo comando?

Ho trovato qualcosa, ma non capisco come funzionano:
TimeSpan (http://msdn.microsoft.com/it-it/library/system.timespan.aspx)
Uso del timeout (http://msdn.microsoft.com/it-it/library/1bff9tk5.aspx)

:confused: :mbe: :stordita:

Matrixbob
22-05-2009, 11:12
In pseudo-linguaggio:

entro il timeout prova ad eseguire quanto segue;
Dim LogRes As Boolean = oLib.Logon(par1, par2, par3, par4)
fine del blocco da eseguire entro il timeout.

MarcoGG
22-05-2009, 14:08
Tecniche possibili ce ne sono parecchie. Una delle pių immediate ( che in pratica rispetta grosso modo il tuo pseudo-codice ) č l'utilizzo di un Thread separato in cui puoi gestire una semplice Sub, o un qualunque metodo di una classe, ad esempio :
Private Sub NomeMetodo()

My.Computer.FileSystem.CopyDirectory("C:\TEST_Sorgente", "C:\TEST_Destinazione")
MsgBox("NomeMetodo Completato")

End Sub

Cerco di fare una copia di una dir, ma voglio che l'operazione sia comunque interrotta entro e non oltre un TimeOut di 2 secondi, perciō :

> TimeOut espresso direttamente in millisecondi :
Dim timeOutMSecs As Integer = 2000 ' Millisecondi TimeOut
Dim THD As New System.Threading.Thread(AddressOf NomeMetodo)
THD.Start()
If THD.Join(timeOutMSecs) = False Then
THD.Abort()
MsgBox("TimeOut [" & timeOutMSecs & "] Raggiunto.")
End If

> oppure con un TimeSpan :
Dim timeOutMSecs As Integer = 2000 ' Millisecondi TimeOut
Dim THD As New System.Threading.Thread(AddressOf NomeMetodo)
THD.Start()
If THD.Join(TimeSpan.FromMilliseconds(timeOutMSecs)) = False Then
THD.Abort()
MsgBox("TimeOut [" & timeOutMSecs & "] Raggiunto.")
End If

Ovvio che cosė, se il metodo coinvolge oggetti e controlli del Thread chiamante, si incorre in un'eccezione Cross-Thread, ma non č nč il tuo caso, nč quello del mio esempio.

Per un esempio pratico di come funzionano i TimeSpan, dai un'occhiata anche qui :
http://www.hwupgrade.it/forum/showthread.php?t=1887994
[ mio post #6 ]

;)

Matrixbob
22-05-2009, 14:10
Tecniche possibili ce ne sono parecchie. Una delle pių immediate ( che in pratica rispetta grosso modo il tuo pseudo-codice ) č l'utilizzo di un Thread separato in cui puoi gestire una semplice Sub, o un qualunque metodo di una classe, ad esempio :

Private Sub NomeMetodo()
My.Computer.FileSystem.CopyDirectory("C:\TEST_Sorgente", "C:\TEST_Destinazione")
MsgBox("NomeMetodo Completato")
End Sub


Cerco di fare una copia di una dir, ma voglio che l'operazione sia comunque interrotta entro e non oltre un TimeOut di 2 secondi, perciō :

> TimeOut espresso direttamente in millisecondi

Dim timeOutMSecs As Integer = 2000 ' Millisecondi TimeOut
Dim THD As New System.Threading.Thread(AddressOf NomeMetodo)
THD.Start()
If THD.Join(timeOutMSecs) = False Then
THD.Abort()
MsgBox("TimeOut [" & timeOutMSecs & "] Raggiunto.")
End If


> oppure con un TimeSpan

Dim timeOutMSecs As Integer = 2000 ' Millisecondi TimeOut
Dim THD As New System.Threading.Thread(AddressOf NomeMetodo)
THD.Start()
If THD.Join(TimeSpan.FromMilliseconds(timeOutMSecs)) = False Then
THD.Abort()
MsgBox("TimeOut [" & timeOutMSecs & "] Raggiunto.")
End If


Ovvio che cosė, se il metodo coinvolge oggetti e controlli del Thread chiamante, si incorre in un'eccezione Cross-Thread, ma non č nč il tuo caso, nč quello del mio esempio.

Per un esempio pratico di come funzionano i TimeSpan, dai un'occhiata anche qui :
http://www.hwupgrade.it/forum/showthread.php?t=1887994
[ mio post #6 ]

;)

:ave: :nera: