none
DataGridView bloquea mi Aplicación RRS feed

  • Pregunta

  • Hola buenos días, por favor ayuden me 

    Tengo una Aplicación que se encarga de Capturar datos llamada Avispa

    y tengo 5 avispas Conectadas de las cuales cuando una captura un dato envía esa información vía socket 

    a un modulo que actúa como multicast, y lo regresa a todas las avispas

    todas las demás avispas lo reciben y actualizan su DataSet y su Datagridview.

     

    Cuando inicio las Avispas trabajan perfectamente todas editan, borran, cancelan bla bla bla

    pero llegan un momento en que deja de trabajar,

    pasa cuando el usuario da clic en el botón nuevo

    en ese momento lo que hago es Habilitar los controles para edición

    deshabilitar el DataGridView

    pero cuando pasa por la instrucción Dg.Enabled = False

    el DataGridView se tarda una eternidad en ejecutarla

    se me queda bloqueado por mucho tiempo

     

    lo mismo me pasa si le doy cancelar, ahora hago Dg.Enabled = True

    y vuelve a tardar muchisimo en ejecutar esa instrucción (30 segundos. 1 minutis aprox)

     

     

    No tengo idea de por donde pueda ser,

    tengo que trabajar mucho sobre esa aplicación para que suceda ese "bloqueo" porque normalmente

    no tiene problemas, los usuarios capturan como 1000 operaciones y cada 200 mas o menos se bloquea.

    tengo enlazado el DataGridView de la siguiente manera...

     

     

     Dim EnlazarSPOT As New BindingSource
    
    Dim CnNuevos As New SqlConnection("User Id='" & Usuario & "';Password='" & Contraseña & "';DataBase='Avispa';Server='" & Servidor & "'")
          
    
    Cmd = New SqlClient.SqlCommand("exec sp_SPOT_Select_Online " & Folio & "," & Folio1000 + 1 & ", '" & Format(Tradedate, "yyyy/MM/dd") & "'", CnNuevos)
          
    Dim Adp As New SqlClient.SqlDataAdapter(Cmd)
    
    
    Adp.Fill(Ds, "SPOT")
    
    EnlazarSPOT.DataSource = Ds.Tables("SPOT")
          
    
    Dg.DataSource = EnlazarSPOT
    

     

    Alguien que tanga una idea 

    de que hacer y porque podría suceder esto?

     

    Cosas que afecten al DataGridView cuando operan es lo siguiente...

     

    'Pinto el registro de color rojo dependiente del status que tenga esa operacion
    
    Dg.Rows(i).DefaultCellStyle.BackColor = MiColor.RojoClaro
    
    
    
    'una celda le cambio constantemente un icono de aceptada o rechazada segun sea el caso...
    
    Dg.Rows(i).Cells("B_").Value = My.Resources.accept
    
    
    
    'a veces las marco con negritas
    Dg.Rows(Posicion).Cells("Rate_").Style.Font = New Font("Tahoma", 8, FontStyle.Bold)
                
    
    'y le cambio el color de la fuente
    Dg.Rows(Posicion).Cells("Rate_").Style.ForeColor = MiColor.Azul
    
    
    ' pero no tiene problemas con esto

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

    miércoles, 12 de mayo de 2010 16:08

Respuestas

  • Hola Omar,

    Debes reemplazar los eventos para que trabajen de forma asincronica usando un delegate

    Cuando estes ejecutando una accion no permitas que otra sea disparada.

    Ademas, las avispas reciben la informacion automaticamente mirando un socket? No utilizas un timer?

    Un poco mas de info vendria bien.

    Tomate tu tiempo para explicarnos y eso nos ayudara a ayudarte.

    Saludos,

     


    MCTS - MCP - MST - New Technologies Evangelist
    miércoles, 12 de mayo de 2010 20:47
  • hola

    pero si es verdad lo que comenta Daniel, entonces quiere decir que cuando poenr simplemente la grilla en disable esta esta realziando una invocacion remota por medio del socket

    y segun entendi en esta oepracion no se establece conexion alguna, o si ?

    simplemente es deshabilitar o no el control, no interviene uan cominucacion en esta operacion

    si hay comunicacion entonces si seria bueno hacerlo en algun proceso en segundo plano, podrias usar el

    BackgroundWorker  

    BackgroundWorker (Componente)

    es bastante simple de usar, lo encuentras en la toolbox del VS

     

    otro tema, note quee sto que haces:

    Cmd = New SqlClient.SqlCommand("exec sp_SPOT_Select_Online " & Folio & "," & Folio1000 + 1 & ", '"& Format(Tradedate, "yyyy/MM/dd") & "'", CnNuevos)

    no esta del todo correcto

    - primero proque para eejcutar stored procedure no se usa el exec

    - segundo no suas parametros en el command

    podrias hacer:

     

    Using cnn As SqlConnection = New SqlConnection("connection string")

        Dim cmd As SqlCommand = New SqlCommand("sp_SPOT_Select_Online", cnn)
        cmd.CommandType = CommandType.StoredProcedure
       
        cmd.Parameters.AddWithValue("@folio", Folio)
        cmd.Parameters.AddWithValue("@folio1000", Folio1000)
        cmd.Parameters.AddWithValue("@tracedate", Tradedate)
       
        cmd.ExecuteNonQuery()

    End Using

    veras que queda algo mas prolijo

    por supuesto los nombre de los parametrso del sp deberias reemplazarlos por los correctos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 13 de mayo de 2010 2:49

Todas las respuestas

  • hola

    la grilla de casualidad tiene un numero importante de registros ?

    igual no creo que sea este el problema

     

    no has probado poner la grilla dentro de un control del tipo Panel o GroupBox y deshabilitar a este y no directo a al grilla, solo para ver como se comporta

     

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    miércoles, 12 de mayo de 2010 18:47
  • se traba de forma variable

    con 36 registros con 100 o con 200

     

    lo segundo que comentas no lo he probado

    pero no sé si sea buena opción

     

    no se

    miércoles, 12 de mayo de 2010 18:52
  • hace lo mismo si lo metro en un GroupBox

     

    =(

    miércoles, 12 de mayo de 2010 19:03
  • Hola Omar,

    Debes reemplazar los eventos para que trabajen de forma asincronica usando un delegate

    Cuando estes ejecutando una accion no permitas que otra sea disparada.

    Ademas, las avispas reciben la informacion automaticamente mirando un socket? No utilizas un timer?

    Un poco mas de info vendria bien.

    Tomate tu tiempo para explicarnos y eso nos ayudara a ayudarte.

    Saludos,

     


    MCTS - MCP - MST - New Technologies Evangelist
    miércoles, 12 de mayo de 2010 20:47
  • me interesa saber como hago un delegate, creo que podria ser por ahí

    pero no se como hacerlo

     

    utilizo una clase que baje de internet, el socket no es con timer

    es un hilo.

     

    y normalmente es cuando las 5 avispas están insertando cuando falla

    es posible que necesite el delegate,

    podrias darme un ejemplo sencillo de como hacerlo?

     

    tks

     

    miércoles, 12 de mayo de 2010 21:23
  • hola

    pero si es verdad lo que comenta Daniel, entonces quiere decir que cuando poenr simplemente la grilla en disable esta esta realziando una invocacion remota por medio del socket

    y segun entendi en esta oepracion no se establece conexion alguna, o si ?

    simplemente es deshabilitar o no el control, no interviene uan cominucacion en esta operacion

    si hay comunicacion entonces si seria bueno hacerlo en algun proceso en segundo plano, podrias usar el

    BackgroundWorker  

    BackgroundWorker (Componente)

    es bastante simple de usar, lo encuentras en la toolbox del VS

     

    otro tema, note quee sto que haces:

    Cmd = New SqlClient.SqlCommand("exec sp_SPOT_Select_Online " & Folio & "," & Folio1000 + 1 & ", '"& Format(Tradedate, "yyyy/MM/dd") & "'", CnNuevos)

    no esta del todo correcto

    - primero proque para eejcutar stored procedure no se usa el exec

    - segundo no suas parametros en el command

    podrias hacer:

     

    Using cnn As SqlConnection = New SqlConnection("connection string")

        Dim cmd As SqlCommand = New SqlCommand("sp_SPOT_Select_Online", cnn)
        cmd.CommandType = CommandType.StoredProcedure
       
        cmd.Parameters.AddWithValue("@folio", Folio)
        cmd.Parameters.AddWithValue("@folio1000", Folio1000)
        cmd.Parameters.AddWithValue("@tracedate", Tradedate)
       
        cmd.ExecuteNonQuery()

    End Using

    veras que queda algo mas prolijo

    por supuesto los nombre de los parametrso del sp deberias reemplazarlos por los correctos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 13 de mayo de 2010 2:49
  • Como dice Leandro efectivamente cuando hago Dg.Enabled = false

    no invoco ninguna conexión, simplemente desHabilito varios controles

    lo que podría estar pasando es que cuando deshabilito el gridview esté llegando

    al mismo tiempo un mensaje y éste a su vez que accese al grid y inserte el registro, 

    ponga en negrita y coloree el fondo.

     

     

    Normalmente al habilitar y deshabilitar el DataGridView no tarda nada

    pero una vez que se empieza a tardar un buen en cambiar ese estado

    desconecto todas las avispas y sin enviar ningún mensaje y sigue igual

    se tarde un buen,

    meti dos botones, con solo una instrucción, enabled = false y otro con enabled = true

    y cuando los presiono, de igual manera se tarda un buen.

    como que se queda tocado con algo, pero ni idea de que

     

     

     

     

     

     

    jueves, 13 de mayo de 2010 12:21
  • hola

    que eventos has defindo en el datagridview ?

    usas el CellFormatting

     

    si lo suas prueba de quitar el handler de ese evento asi no se lanza, y ver si peude ser la causa del problema

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    jueves, 13 de mayo de 2010 12:29
  • no, no uso el CellFormatting

     

    para colorear mi DataGrid uso lo siguiente, eso esta bien?

     

     Delegate Sub Delegate_Colorear_Registros()
    
    '--------------------------------------------------------
    
    private sub Pintar()
    
    Dim del As New Delegate_Colorear_Registros(AddressOf Colorear_Registros)
    
          
    Dim Async As IAsyncResult = del.BeginInvoke(New AsyncCallback(AddressOf Evento_CallBack_Colorear_Registros), Nothing)
    
    end sub
    
    
    
     Private Sub Evento_CallBack_Colorear_Registros(ByVal Async As IAsyncResult)
    
        MsgBox("Termina el pintado")
    
    
    
    
      End Sub
    

    siento que me falta algo en el evento callback para finalizar 

    pero no se como hacerlo

     


    jueves, 13 de mayo de 2010 13:11