Foros del Web » Programación para mayores de 30 ;) » .NET »

¿Porqué se para mi hilo?

Estas en el tema de ¿Porqué se para mi hilo? en el foro de .NET en Foros del Web. Hola amigos, mi aplicación consta de un hilo que tiene q correr continuamente a menos que se pulse un botón que lo pare. He hecho ...
  #1 (permalink)  
Antiguo 26/10/2006, 02:53
Avatar de SuperPinwi  
Fecha de Ingreso: septiembre-2005
Mensajes: 317
Antigüedad: 18 años, 8 meses
Puntos: 1
¿Porqué se para mi hilo?

Hola amigos,

mi aplicación consta de un hilo que tiene q correr continuamente a menos que se pulse un botón que lo pare. He hecho un evento que controle que al parar el hilo, una bandera cambie de valor y entonces el hilo no se vuelva a ejecutar en lugar de utilizar el método abort. Hasta aquí todo bien.

He controlado que no se produzca la excepción ThreadStateException con una sentencia if, en la cual verifico que el estado sea running para que siga ejecutándose.

El problema es q, una vez que ejecuto otra opción del programa (seleccionar un menú por ejemplo), EL HILO SE PARA SOLO!!!! y el caso es q no entiendo porqué...

¿Qué puedo hacer para que no se pare al seleccionar otra opción de la aplicación?

Gracias!!!

Saludines

Última edición por SuperPinwi; 26/10/2006 a las 05:18 Razón: dar información más exacta
  #2 (permalink)  
Antiguo 26/10/2006, 07:38
 
Fecha de Ingreso: agosto-2006
Ubicación: en lima peru
Mensajes: 184
Antigüedad: 17 años, 8 meses
Puntos: 0
Pasame el codigo de tu hilo para analizarlo

hola seria conveniente que nos des el codigo para chekearlo
  #3 (permalink)  
Antiguo 26/10/2006, 23:09
Avatar de SuperPinwi  
Fecha de Ingreso: septiembre-2005
Mensajes: 317
Antigüedad: 18 años, 8 meses
Puntos: 1
Gracias por el interés, a ver si me puedes ayudar!!

El código de lo q tiene q ver con el hilo es este:

Código:
'
    'Llama al evento asociado a un clic sobre el botón iniciar del 
    'formulario
    Private Sub BIniciar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BIniciar.Click
        comandoIniciar()
    End Sub
    '
    'Llama al evento asociado a un clic sobre el botón parar del 
    'formulario
    Private Sub BParar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles BParar.Click
        banderaLeer = True
    End Sub
'
'Evento asociado a la selección del submenú Leer BD del menú Archivo
    'descripción: inicia el hilo que lee información de la base de datos
    'y la muestra en el formulario principal
    Public Sub comandoIniciar()
        banderaLeer = False
        ThreadLeerBD = New System.Threading.Thread(AddressOf Me.EjecutaHiloBD)
        ThreadLeerBD.start()
        ThreadLeerBD.IsBackground()
        actualizaLeerBD(ThreadLeerBD)
        compruebaHiloLeerActivo(ThreadLeerBD)
    End Sub
    '
    'Método actualizaLeerBD
    'descripción: se encarga de dejar de leer en el caso de que se haya
    'pulsado el botón parar
    Public Sub actualizaLeerBD(ByVal ThreadLeerBD As System.Threading.Thread)
        System.Windows.Forms.Application.DoEvents()
        If ThreadLeerBD.ThreadState.Running = True Then
            ThreadLeerBD.Start()
            ThreadLeerBD.IsBackground = True
        ElseIf ThreadLeerBD.ThreadState.Unstarted = True Or ThreadLeerBD.ThreadState.Stopped = True Then
            ThreadLeerBD = New System.Threading.Thread(AddressOf Me.EjecutaHiloBD)
            ThreadLeerBD.Start()
            ThreadLeerBD.IsBackground = True
        End If
    End Sub
    '
    'Método compruebaHiloLeerActivo
    'descripción: se encarga de comprobar si el hilo leer está activo, y en
    'caso de que no lo esté, volver a iniciarlo tras una pausa de 1 segundo.
    '
    Public Sub compruebaHiloLeerActivo(ByVal ThreadLeerBD As System.Threading.Thread)
        While banderaLeer = False
            System.Windows.Forms.Application.DoEvents()
            'ThreadLeerBD.Sleep(500)
            actualizaLeerBD(ThreadLeerBD)
        End While
    End Sub
    '
'HILO LEE BASE DE DATOS
    'descripción: se encarga de leer una base de datos y mostrar por 
    'pantalla en la interfaz principal los valores que de ella obtiene.
    Public Shared Sub EjecutaHiloBD()

        Dim objAcciones As New OleDbCommand
        'Define una transacción, para evitar conflictos de concurrencia
        Dim transaccion As OleDbTransaction
        Dim dt As DataTable
        Dim objAdapter
        'Dim OleDbUpdateCommand As OleDbCommand = New OleDbCommand
        'Variable de bucle
        Dim i As Integer
        'Para manejar las filas de la base de datos
        Dim fila As Integer
        'Para conocer el número de filas
        Dim n As Integer
        'Cadenas temporales para las variables de la base de datos
        Dim sDescripcion As String
        Dim sValor As String
        Dim sVisibilidad As String
        Dim sID As String
        'Crea un array de etiquetas para manejar los datos que en ellas se muestran más cómodamente
        Dim etiquetas(10) As Label
        etiquetas(0) = Label1
        etiquetas(1) = Label2
        etiquetas(2) = Label3
        etiquetas(3) = Label4
        etiquetas(4) = Label5
        etiquetas(5) = Label6
        etiquetas(6) = Label7
        etiquetas(7) = Label8
        etiquetas(8) = Label9
        etiquetas(9) = Label10
        'Array que contiene los textfields del formulario
        Dim camposTexto(10) As TextBox
        camposTexto(0) = TextBox1
        camposTexto(1) = TextBox2
        camposTexto(2) = TextBox3
        camposTexto(3) = TextBox4
        camposTexto(4) = TextBox5
        camposTexto(5) = TextBox6
        camposTexto(6) = TextBox7
        camposTexto(7) = TextBox8
        camposTexto(8) = TextBox9
        camposTexto(9) = TextBox10
        'Array que contiene un campo booleano con la visibilidad de un campo
        Dim visibilidad(10) As Boolean

        Try
            'Se abre la conexión de la base de datos
            objConn.Open()
            'Se escogen los registros de la base de datos que se desean
            objAdapter = New OleDbDataAdapter("SELECT * FROM Propiedades ORDER BY ID", objConn)
            'Inicio de la transacción
            transaccion = objConn.BeginTransaction() 'IsolationLevel.ReadCommitted)
            objAcciones.Transaction = transaccion
            objAcciones.Connection = objConn
            objAdapter.selectcommand.transaction = transaccion
            'Se almacena la base de datos en el dataTable
            dt = New DataTable
            objAdapter.Fill(dt)
            'Se almacena en n el número de filas de la base de datos
            n = dt.Rows.Count
            'Se asocia la conexión con el objeto acciones
            objAcciones.Connection = objConn
            If n = 0 Then
                MessageBox.Show("No se ha encontrado ningún registro que coincida con la selección")
            Else
                'Recorre las filas en el dataTable y las va asignando a las etiquetas
                'del formulario principal para que se muestren
                For fila = 0 To n - 1
                    'Asignar a las variables el contenido del registro
                    sDescripcion = dt.Rows(fila)("descripcion").ToString
                    sValor = dt.Rows(fila)("valor").ToString
                        etiquetas(fila).Text = sDescripcion
                        camposTexto(fila).Text = sValor
                Next
                'Finalización exitosa de la transacción
                transaccion.Commit()
            End If
        Catch ex As Exception
            'En el caso de que haya algún error, deshace los cambios y
            'muestra un aviso con información sobre el problema
            transaccion.Rollback()
            MessageBox.Show(Err.Description, "Información del sistema")
        Finally
            'Cierra la conexión de la base de datos
            objConn.Close()
        End Try
    End Sub
y algo q haría q se pare, sería la selección de cualquier menú Item como por ejemplo:

Código:
 Private Sub MICbd_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MICbd.Click
        Try
            Dim dlgFile = New OpenFileDialog
            dlgFile.Filter = "Base de datos (*.mdb) | *.mdb"
            dlgFile.Title = "Selecciona la base de datos"
            'Si el diálogo devuelve OK
            If dlgFile.ShowDialog() = DialogResult.OK Then
                'Nombre del archivo elegido, con su ruta completa,
                'equivale a la base de datos
                ruta = dlgFile.FileName
            End If
        Catch ex As Exception
            MessageBox.Show("La base de datos no ha sido seleccionada correctamente", "Aviso")
        End Try
    End Sub

Última edición por SuperPinwi; 26/10/2006 a las 23:14
  #4 (permalink)  
Antiguo 27/10/2006, 02:13
Avatar de SuperPinwi  
Fecha de Ingreso: septiembre-2005
Mensajes: 317
Antigüedad: 18 años, 8 meses
Puntos: 1
me he dado cuenta que el problema radica en que el bucle mediante el que intento mantenerlo con vida no está bien, no es realmente porque seleccione otra opción del programa...

sabéis cómo hacer q se repita continuamente??

Thanx
  #5 (permalink)  
Antiguo 27/10/2006, 04:05
Avatar de freegirl
Colaborador
 
Fecha de Ingreso: octubre-2003
Ubicación: Catalonia
Mensajes: 4.334
Antigüedad: 20 años, 7 meses
Puntos: 156
Hola superpinwi,

cual es hilo que se te para? el "compruebaHiloLeerActivo"?

saludos
  #6 (permalink)  
Antiguo 27/10/2006, 06:11
Avatar de SuperPinwi  
Fecha de Ingreso: septiembre-2005
Mensajes: 317
Antigüedad: 18 años, 8 meses
Puntos: 1
Hola freegirl
Pues es q pensaba q era al seleccionar otra opción de menú pero realmente lo q pasa es q no se volvía a repetir como debería.
Lo acabo de solucionar gracias a una pequeña ayudita jeje
por si le sirve a alguien lo pego a continuación

Saludos y pasa un buen finde!

Código:
Private myDBThread As System.Threading.Thread 

    'First Sub to Call 
    Public Sub initThread() 
        myDBThread = New System.Threading.Thread(AddressOf Me.myWork) 
        actualizThreadState() 
    End Sub 

    'Thread Job 
    Public Sub myWork() 
        If myDBThread.ThreadState = Threading.ThreadState.Running Then 
            'I think that this sub is dedicated to sync data to you DB 
        Else 
            'the thread don't run ? 
            actualizThreadState() 
        End If 

    End Sub 

    ' 
    Function actualizThreadState() 
        If myDBThread.ThreadState = Threading.ThreadState.Stopped Then 
            'what to do when stop 
            ' for example an alert, or restart the thread .. 
        ElseIf myDBThread.ThreadState = Threading.ThreadState.Unstarted Then 
            'before it's started 
            myDBThread.Start() 
            myDBThread.IsBackground = True 
        End If 
    End Function 

    'Sub when the stop button is clicked 
    Private Sub ButtonSTOP_Click() 
        If myDBThread.ThreadState = Threading.ThreadState.Running Then 
            myDBThread.Abort() 
        End If 
    End Sub
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 22:08.