none
Aplicación se cuelga usando hilos y delegados RRS feed

  • Pregunta

  • hola gente. estoy teniendo problemas para mostrar un formulario de progreso. ya probé usando un hilo para el progreso junto con un delegado para acceder a los controles del form. y otro para el progreso

    dejo mi código donde llamo al progreso.

    Private Sub insertarCuotas()
            Try
                
                        If Not DGVCuotas.Rows.Cast(Of DataGridViewRow).Any(Function(x) CBool(x.Cells("ColCheckbox").Value)) Then
                            Return
                        End If
                        Dim repetidos As Integer = 0
                BackgroundWorker1.RunWorkerAsync()
                Progress.Show()
                        Using conn As New SqlConnection(ConfigurationManager.ConnectionStrings("conexion").ConnectionString)
                            Dim query1 As String = "INSERT INTO CuotasPorCobrar (cuotaDetalle, idMatricula, Periodo, FechaVencimiento, Monto, MontoInscrip, MontoOtros, Estado, idCurso, Facturada, MontoExtraprog) VALUES (@CDetalle, @Id_Matri, @Periodo, @Fecha_Vencimiento, @Monto, @MontoI, @MontoOtros, @Estado, @idCurso, @Facturada, @Extraprog)"
                            For Each row As DataGridViewRow In DGVCuotas.Rows
                                If CBool(row.Cells("ColCheckbox").Value) Then
                                    If Not DGV_origen.Rows.Cast(Of DataGridViewRow).Any(Function(x) CBool(x.Cells("selec").Value)) Then
                                        Return
                                    End If
                                    For Each row2 As DataGridViewRow In DGV_origen.Rows
                                        If CBool(row2.Cells("selec").Value) Then
                                            Using cmd As New SqlCommand(query1, conn)
    
                                                cmd.Parameters.AddWithValue("@CDetalle", CStr(row.Cells("descCuota").Value))
                                                cmd.Parameters.AddWithValue("@Id_Matri", CInt(row2.Cells("Matri").Value))
                                                cmd.Parameters.AddWithValue("@Periodo", CInt(numup_periodo.Value))
                                                cmd.Parameters.AddWithValue("@Fecha_Vencimiento", CStr(row.Cells("Vencimiento").Value))
                                                cmd.Parameters.AddWithValue("@monto", If(String.IsNullOrEmpty(row.Cells("monto").ToString), DirectCast(DBNull.Value, Object), (row.Cells("monto").Value)))
                                                cmd.Parameters.AddWithValue("@MontoI", If(String.IsNullOrEmpty(row.Cells("MontoInscrip").ToString), DirectCast(DBNull.Value, Object), (row.Cells("MontoInscrip").Value)))
                                                cmd.Parameters.AddWithValue("@MontoOtros", If(String.IsNullOrEmpty(row.Cells("MontoOtros").ToString), DirectCast(DBNull.Value, Object), (row.Cells("MontoOtros").Value)))
                                                cmd.Parameters.AddWithValue("@Extraprog", If(String.IsNullOrEmpty(row.Cells("Extraprog").ToString), DirectCast(DBNull.Value, Object), (row.Cells("Extraprog").Value)))
                                                'cmd.Parameters.AddWithValue("@Monto", Convert.ToDecimal(row.Cells("monto").Value))
                                                'cmd.Parameters.AddWithValue("@Monto", Convert.ToDecimal(row.Cells("monto").Value))
                                                cmd.Parameters.AddWithValue("@Estado", CBool(False))
                                                cmd.Parameters.AddWithValue("@Facturada", CBool(False))
    
                                                cmd.Parameters.AddWithValue("@idCurso", CStr(cmb_curso_destino.SelectedValue))
    
                                                Try
                                                    conn.Open()
                                                    cmd.ExecuteNonQuery()
                                                    conn.Close()
                                                Catch ex As Exception
                                                    If ex.ToString.Contains("Infracción de la restricción") Then
                                                        repetidos += 1
                                                    Else
                                                        MsgBox(ex.ToString)
                                                    End If
                                                    conn.Close()
                                                End Try
    
    
                                            End Using
                                        End If
                                    Next
                                    ' Otra mejora sería pasar el CHECK a falso una vez procesado el insert.
                                    'row.Cells(0).Value = False
                                End If
                            Next
                        End Using
                        '+++++++++limpiar++++++++++
                        For i As Integer = 0 To Me.DGVCuotas.RowCount - 1 ' limpiar DGV Cuotas
                            Me.DGVCuotas.Rows.Remove(Me.DGVCuotas.CurrentRow)
                        Next
                        Me.Check_Cuotas_selec.Checked = False
                        Dim resultado2 As DialogResult
                        If repetidos > 0 Then
                            MensajePersonalizado("¡Operación exitosa!" & saltolinea & _
                                                "Cuotas Agregadas correctamente" & saltolinea & repetidos.ToString & " " & "Registro/s omitidos" & saltolinea & _
                                                "¿Desea Agregar mas Cuotas a las matriculas?", "Información", My.Resources.Icon_Pregunta, True, "Si", "No", resultado2)
                        Else
                            MensajePersonalizado("¡Operación exitosa!" & saltolinea & _
                                                "Cuotas Agregadas correctamente" & saltolinea & _
                                                "¿Desea Agregar mas Cuotas a las matriculas?", "Información", My.Resources.Icon_Pregunta, True, "Si", "No", resultado2)
                        End If
                        'check_STodos.Checked = False
                        '+++++++++++++++++++++++++++++++
    
                        If resultado2 = DialogResult.OK Then
                            'sí, se agregarán más cuotas
                        ElseIf resultado2 = Windows.Forms.DialogResult.Cancel Then
                            limpiarcontroles()
                        End If
                   
    
            Catch ex As Exception
                MsgBox(ex.ToString)
            End Try
    
        End Sub

    este inicia junto con el hilo del main. aunque ya probé separando los hilos, lo que me sospecho es que uso demasiado los controles por eso se cuelga, son dos ciclos for anidados.

    desde ya muchas gracias

    • Cambiado Enrique M. Montejo domingo, 14 de febrero de 2016 7:38 Pregunta relacionada con Windows Forms.
    jueves, 11 de febrero de 2016 22:21