none
Timer RRS feed

  • Pregunta

  • Hola a todos:

    Estoy aprendiendo a usar timer

    Hago como ejemplo

        Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Dim tm As Timer = New Timer(poner_reloj, Nothing, 0, 1000)
        End Sub
    
        Function poner_reloj() As Boolean
            response.Write(Now)
            poner_reloj = True
        End Function
    

    Quiero mostrar la hora cada segundo.

    Me da un error en la segunda linea: 'un valor boolen no puede convertirse en un system.threading.timercallback

    El caso es que no sé muy bien qué es timercallback

    ¿Me podeis decir qué hago mal?

    Gracias anticipadas.

    domingo, 25 de octubre de 2015 14:21

Todas las respuestas

  • Hola

    El error se genera debido a que tratas de convertir un objeto de un tipo a otro que no puede hacer una conversion de manera automatica.

    El mostrar el reloj no es dificil, te comparto un link donde viene como hacerlo.

    https://agonzalesdv.wordpress.com/2009/08/25/reloj-digital-en-vb-net-funcion-timer/

    Saludos

    domingo, 25 de octubre de 2015 16:20
  • ¿Me podeis decir qué hago mal?

    Me temo que estás confundiendo los tipos de Timer. En .NET hay al menos cuatro tipos distintos de Timer (que me vengan a la mente ahora mismo): System.Windows.Forms.Timer, System.Threading.Thread.Timer, System.Timers.Timer, y System.Web.Extensions.Timer.

    Los tres primeros no se pueden usar en ASP.NET, ya que la clase servidora se destruye a cada postback, destruyendo en consecuencia el Timer, que en cualquier caso no puede mostrar nada en pantalla una vez que ha terminado el postback y la página ya se ha servido al navegador.

    Tendrías que usar un timer de javascript (que rueda en la página web y no en el navegador), o bien un Timer de las Extensiones AJAX (que es el System.Web.Extensions.Timer que te indiqué antes), que genera automáticamente por tí el javascript y lo inyecta en la página. No debes instanciarlo desde el Code-behind, arrástralo desde las extensiones Ajax sobre el diseñador de aspx (está en la misma pestaña del toolbox que el UpdatePanel).

    domingo, 25 de octubre de 2015 16:22
  • Hola:

    Así es, Alberto. Ahora lo leo

    Uso

    <asp:Timer id="tmreloj" Interval="5000" OnTick="poner_reloj" runat="server"></asp:Timer>

    Ahora quiero conocer el número de veces que hace poner_reloj. Esto es:1 si 5 segundos, 2 si 10 segundos, 3 si 15 segundos etc.

    De esta forma sabiendo el número de veces, como un contador, puedo saber el nombre de fichero y longitud para cambiar la tabla de la barra de progreso (los style). Este timer lo uso para crear y actualizar una tabla que tengo como barra de progreso

    Esto es un reto

    ¿Me podeis decir cómo hallar el número de pasadas de poner_reloj?

    Gracias



    • Editado volar.2014 domingo, 25 de octubre de 2015 17:27
    domingo, 25 de octubre de 2015 17:14
  • ¿Me podeis decir cómo hallar el número de pasadas de poner_reloj?

    Simplemente utiliza tu propia variable para contar el número de pasadas. Inicialízala a cero y súmale 1 cada vez que se dispare el Tick.

    Acuérdate de que estás en una aplicación web, y que por tanto las variables de clase no sobreviven a los postbacks. Tendrás que preservar la variable recurriendo a cualquiera de las técnicas de conservación del estado, como por ejemplo salvarla en el ViewState o en el Session.

    domingo, 25 de octubre de 2015 18:11
  • Hola:

    Debería de salir. Sin embargo no es así

    Tengo

        Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            'Dim tm As Timer = New Timer(poner_reloj, Nothing, 0, 100)
            'tdbarra1.Attributes("Style") = "width:3px;background-color:blue"
            'lblfichero.Text = "ejemplo.com"
            Session("poner_reloj") = 0
        End Sub
    
        Sub poner_reloj()
            'Static inti As Integer
            Dim strtitulo As String = fufichero.FileName
            Dim declongitud As Decimal = fufichero.PostedFile.ContentLength
            'inti=Choose(valor,file
            Session("poner_reloj") += 1
            Response.Write(Session("poner_reloj"))
            lblfichero.Text = strtitulo
            Response.Write("<p>" & Now)
        End Sub

    Siempre pone el valor 1. ¿Qué sale mal?

    Este es el html

    <%@ Page CodeFile="ejemplo.aspx.vb" Inherits="codigo" %>
            <form ID="frm" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
            <asp:Timer id="UpdateTimer" Interval="1" OnTick="poner_reloj" runat="server"></asp:Timer>
    
                    <table id="tblbarraprogreso" border='0' style="height:5px;border-spacing:0" runat="server">
    <tr>
    	<td id="tdbarra1" runat="server">&nbsp;</td>
    	<td id="tdbarra2" runat="server">&nbsp;</td>
    	<td id="tdbarra3" runat="server">&nbsp;</td>
    	<td id="tdbarra4" runat="server">&nbsp;</td>
    	<td id="tdbarra5" runat="server">&nbsp;</td>
    	<td id="tdbarra6" runat="server">&nbsp;</td>
    	<td id="tdbarra7" runat="server">&nbsp;</td>
    	<td id="tdbarra8" runat="server">&nbsp;</td>
    	<td id="tdbarra9" runat="server">&nbsp;</td>
    	<td id="tdbarra10" runat="server">&nbsp;</td>
    	<td id="tdbarra11" runat="server">&nbsp;</td>
    	<td id="tdbarra12" runat="server">&nbsp;</td>
    	<td id="tdbarra13" runat="server">&nbsp;</td>
    	<td id="tdbarra14" runat="server">&nbsp;</td>
    	<td id="tdbarra15" runat="server">&nbsp;</td>
    	<td id="tdbarra16" runat="server">&nbsp;</td>
    	<td id="tdbarra17" runat="server">&nbsp;</td>
    	<td id="tdbarra18" runat="server">&nbsp;</td>
    	<td id="tdbarra19" runat="server">&nbsp;</td>
    	<td id="tdbarra20" runat="server">&nbsp;</td>
        <td id="thporcentaje" runat="server">&nbsp;<b>0 %</b> <asp:label id=lblfichero runat="server"></asp:label></td>
    </tr>
    </table>
    
                <asp:FileUpload ID="fufichero" runat="server" />
    
    
    </form>
    
    

    Necesito conocer el  número de pasadas de poner_reloj.

    Gracias anticipadas


    • Editado volar.2014 domingo, 25 de octubre de 2015 19:43
    domingo, 25 de octubre de 2015 19:39
  • Siempre pone el valor 1. ¿Qué sale mal?

    Sale mal porque en el Page_Load estás inicializando el valor a 0. En las aplicaciones web, el Page_Load se ejecuta en todos los postbacks, y por tanto se ejecuta en todos los eventos Tick, y por eso te reinicializa la cuenta a cero en cada tick. Ponle una condición para que solo lo haga la primera vez:

    If Not Page.IsPostBack Then Session("poner_reloj") = 0

    • Marcado como respuesta volar.2014 domingo, 25 de octubre de 2015 20:16
    • Desmarcado como respuesta volar.2014 domingo, 25 de octubre de 2015 20:19
    domingo, 25 de octubre de 2015 19:48
  • Hola:

    He modificado el html de forma que haga un updatepanel, ya que sólo quiero actualizar la tabla de la barra de progreso. Sin embargo no actualiza nada.

    El html queda

    <%@ Page CodeFile="ejemplo.aspx.vb" Inherits="codigo" %>
            <form ID="frm" runat="server">
    <asp:ScriptManager ID="ScriptManager1" runat="server" />
            <asp:Timer id="UpdateTimer" Interval="10" OnTick="poner_reloj" runat="server"></asp:Timer>
    
                <asp:UpdatePanel runat="server" id="TimedPanel" updatemode="Conditional">
              
    
                    
                      <Triggers>
                    <asp:AsyncPostBackTrigger controlid="UpdateTimer" eventname="Tick" />
                </Triggers>
                <ContentTemplate>
                    <table id="tblbarraprogreso" border='0' style="height:5px;border-spacing:0" runat="server">
    <tr>
    	<td id="tdbarra1" runat="server">&nbsp;</td>
    	<td id="tdbarra2" runat="server">&nbsp;</td>
    	<td id="tdbarra3" runat="server">&nbsp;</td>
    	<td id="tdbarra4" runat="server">&nbsp;</td>
    	<td id="tdbarra5" runat="server">&nbsp;</td>
    	<td id="tdbarra6" runat="server">&nbsp;</td>
    	<td id="tdbarra7" runat="server">&nbsp;</td>
    	<td id="tdbarra8" runat="server">&nbsp;</td>
    	<td id="tdbarra9" runat="server">&nbsp;</td>
    	<td id="tdbarra10" runat="server">&nbsp;</td>
    	<td id="tdbarra11" runat="server">&nbsp;</td>
    	<td id="tdbarra12" runat="server">&nbsp;</td>
    	<td id="tdbarra13" runat="server">&nbsp;</td>
    	<td id="tdbarra14" runat="server">&nbsp;</td>
    	<td id="tdbarra15" runat="server">&nbsp;</td>
    	<td id="tdbarra16" runat="server">&nbsp;</td>
    	<td id="tdbarra17" runat="server">&nbsp;</td>
    	<td id="tdbarra18" runat="server">&nbsp;</td>
    	<td id="tdbarra19" runat="server">&nbsp;</td>
    	<td id="tdbarra20" runat="server">&nbsp;</td>
        <td id="thporcentaje" runat="server">&nbsp;<b>0 %</b> <asp:label id=lblfichero runat="server"></asp:label></td>
    </tr>
    </table>
                </ContentTemplate>
            </asp:UpdatePanel>
    
                <asp:FileUpload ID="fufichero" runat="server" />
    
    
    </form>
    
    


    El código es 

    Imports Microsoft.VisualBasic
    Imports System
    Imports System.Threading
    
    Partial Class codigo
        Inherits System.Web.UI.Page
    
        Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            'Dim tm As Timer = New Timer(poner_reloj, Nothing, 0, 100)
            'tdbarra1.Attributes("Style") = "width:3px;background-color:blue"
            'lblfichero.Text = "ejemplo.com"
            If Not IsPostBack Then ViewState("poner_reloj") = 0
        End Sub
    
        Sub poner_reloj()
            'Static inti As Integer
            Dim strtitulo As String = fufichero.FileName
            Dim declongitud As Decimal = fufichero.PostedFile.ContentLength
            'inti=Choose(valor,file
    
            ViewStatea("poner_reloj") += 1
            Response.Write(viewstate("poner_reloj"))
            lblfichero.Text = strtitulo
            Response.Write("<p>" & Now)
        End Sub
    
    End Class
    
    

    ¿Por qué no actualiza bien?, es decir, ¿por qué la session("poner_reloj") no cambia?

    Gracias.

    domingo, 25 de octubre de 2015 20:23
  • Hola a todos:

    Tengo el código

    Imports Microsoft.VisualBasic
    Imports System
    Imports System.Threading
    
    Partial Class codigo
        Inherits System.Web.UI.Page
    
        Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            'Dim tm As Timer = New Timer(poner_reloj, Nothing, 0, 100)
            'tdbarra1.Attributes("Style") = "width:3px;background-color:blue"
            'lblfichero.Text = "ejemplo.com"
            If Not IsPostBack Then ViewState("poner_reloj") = 0
        End Sub
    
        Sub subir(ByVal s As Object, ByVal e As EventArgs) Handles btnsubir.Click
            UpdateTimer.Enabled = True
        End Sub
    
        Sub poner_reloj()
            Dim inti As Integer
            Dim strtitulo As String = fufichero.FileName
            Dim declongitud As Decimal = fufichero.PostedFile.ContentLength
            'inti=Choose(valor,file
            ViewState("poner_reloj") += 1
            If ViewState("poner_reloj") <= 20 Then
                For inti = 1 To ViewState("poner_reloj")
                    DirectCast(FindControl("tdbarra" & inti), HtmlTableCell).Attributes("Style") = "width:3px;background-color:blue"
                Next
                For inti = ViewState("poner_reloj") + 1 To 20
                    DirectCast(FindControl("tdbarra" & inti), HtmlTableCell).Attributes("Style") = "width:3px;background-color:#B5CCFF"
                Next
                thporcentaje.InnerHtml = "&nbsp;" & ViewState("poner_reloj") * 5 & " %"
            Else
                UpdateTimer.Dispose()
            End If
            lblfichero.Text = strtitulo
        End Sub
    
    End Class
    
    

    Quisiera que mientras suba ficheros se muestre la tabla barra de progreso. Peroo choco con que mientras subo no puedo hacer nada más, la subida es un 'blocking request'

    ¿Cómo solucionar esto?

    Gracias de antemano

    lunes, 26 de octubre de 2015 8:58