Delegados en hilos... algo raro

Iniciado por Zzombi, 18 Noviembre 2009, 02:57 AM

0 Miembros y 3 Visitantes están viendo este tema.

Zzombi

hola a todos.

he estado practicando con los delagados en los hilos y la verdad es que me da la sencación de que es màs lento trabajar con delegados.... hice un simple hilo con delegados que llenaba un listBox y luego otro hilo sin delegados (lo cual es màs peligroso) y fue màs ràpido que el con delegados....

estoy ocupando mal los delegados o efectivamente es màs lento?

saludos

MANULOMM

los delegados en los hilos son realmente necesarios pues son los que te perimiten la sincronizacion entre hilos, la tarea que haces debe llevar delegados pues tomas los datos en el hilo1 y debes recrearlos en el hilo principal (Interfaz Grafica), para esto requieres un delegado, en cuanto a como estas implementando los mismos pues hasta no ver un trozo de codigo no podria asegurarte nada, pon los dos metodos que utilizas y podremos ayudarte.

Atentamente,

Juan Manuel Lombana
Medellín - Colombia


Zzombi

mira este código con delegados

Código (vbnet) [Seleccionar]

Imports System.Threading

Public Class Form1
    Inherits Form
    Dim t As New Thread(AddressOf hilo)
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        t.Start()
    End Sub

    Private Sub hilo()
        addList()
    End Sub

    Delegate Sub delegado()

    Private Sub addList()
        If ListBox1.InvokeRequired Then
            Dim d As New delegado(AddressOf addList)
            Me.Invoke(d)
        Else
            Dim c As Integer = 0

            For c = 0 To 10000
                ListBox1.Items.Add("valor" & c)
                t.Sleep(2000)
            Next
        End If
    End Sub

       Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

    End Sub
End Class


y ete otro sin delegados

Código (vbnet) [Seleccionar]

Imports System.Threading

Public Class Form1
    Inherits Form
    Dim t As New Thread(AddressOf hilo)
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        t.Start()
    End Sub

    Private Sub hilo()
        Dim c As Integer = 0

        For c = 0 To 10000
            ListBox1.Items.Add("valor" & c)
            t.Sleep(2000)
        Next
    End Sub

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        CheckForIllegalCrossThreadCalls = False
    End Sub

    Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles TextBox1.TextChanged

    End Sub
End Class


en el segundo código la aplicación me permite trabajar con el textbox mientras se llena el listbox mientras que el primer código con delegados no me deja hacer nada más hasta que termine de llenarse el listbox.... por eso estoy diciendo que con delegados cambia la cosa.

bueno espero que alguien me pueda ayudar

saludos.

raul338

#3
no se que version del visual studio estaras usando. pero yo usando la 2008, no me deja usar thread.sleep  :laugh:

Bueno, para notar la diferencia implemente un timer que me cuente las milesimas de segundo que cuenta desde presionar el boton, hasta terminar el bucle

La diferencia?...10 a 15 centesimas de segundo  :xD
EDIT: perdon, me equivoque, luego de ver....eran decimasa de segundo XD... asi que el metodo con delegados , tardaba 1,5 segundos, mientras sin el delegado tardaba 1,8 a 1,9 segundos..... sigue sin haber tanta diferencia  ;D

No le veo tanta diferencia. Pero!, creo que tardaria mucho más si es que harias el bucle dentro del trhead y dentro del bucle llames al delegado.

Fuera de eso, alguien pudo usar Thread.Sleep en visual studio 2008? (de cualquier manera, CurrentThread, t.Sleep, etc???)  :huh:

Zzombi

Cita de: raul338 en 18 Noviembre 2009, 22:10 PM
no se que version del visual studio estaras usando. pero yo usando la 2008, no me deja usar thread.sleep  :laugh:

Bueno, para notar la diferencia implemente un timer que me cuente las milesimas de segundo que cuenta desde presionar el boton, hasta terminar el bucle

La diferencia?...10 a 15 centesimas de segundo  :xD
EDIT: perdon, me equivoque, luego de ver....eran decimasa de segundo XD... asi que el metodo con delegados , tardaba 1,5 segundos, mientras sin el delegado tardaba 1,8 a 1,9 segundos..... sigue sin haber tanta diferencia  ;D

No le veo tanta diferencia. Pero!, creo que tardaria mucho más si es que harias el bucle dentro del trhead y dentro del bucle llames al delegado.

Fuera de eso, alguien pudo usar Thread.Sleep en visual studio 2008? (de cualquier manera, CurrentThread, t.Sleep, etc???)  :huh:

puntualmente mi problema no tiene que ver con velocidad

si no con esto (cito lo que escribí anteriormente)

"en el segundo código la aplicación me permite trabajar con el textbox mientras se llena el listbox mientras que el primer código con delegados no me deja hacer nada más hasta que termine de llenarse el listbox.... por eso estoy diciendo que con delegados cambia la cosa."

raul338

Cita de: Zzombi en 18 Noviembre 2009, 22:26 PM

"en el segundo código la aplicación me permite trabajar con el textbox mientras se llena el listbox mientras que el primer código con delegados no me deja hacer nada más hasta que termine de llenarse el listbox.... por eso estoy diciendo que con delegados cambia la cosa."

nose xq nunca habia visto eso jajaja...... eso me pasa x leer rapido XD

Simple, agrega un "Application.DoEvents()" al final del bucle (dentro del bucle, como ultima instruccion). Opcionalmente deshabilitas el listbox en el llenado si no quieres tener "lag" (a veces pestañea cuando agregas gran cantidad de items)

Zzombi

no me funciona... ahora cuando termina el Sleep me muestra lo que escribo en el textbox pero no es igual a colocar CheckForIllegalCrossThreadCalls = False que puedo escribir en el textbox paralelamente mientras se llena el listbox

raul338

por que a nadie le funciona el DoEvents?!?!?! jaja

Lo malo es que no es recomendable usar CheckForIllegalCrossThreadCalls, ... es raro el problema, que version del framework estas programando?

Zzombi

el doEvents si me funciono pero no servia para el proposito que quería U.U


estoy ocupando framework 3.5.. y también probe con el 2.0

raul si tienes tiempo libre podrías probar el código para que me entiendas mejor a lo que me refiero..

saludos y gracias por tu tiempo raul

43H4FH44H45H4CH49H56H45H

Cita de: Zzombi en 18 Noviembre 2009, 22:26 PM"el primer código con delegados no me deja hacer nada más hasta que termine de llenarse el listbox.... por eso estoy diciendo que con delegados cambia la cosa."

Asi podriamos hacer funcionar tu código:

Código (vbnet) [Seleccionar]
Imports System
Imports System.ComponentModel
Imports System.Threading
Imports System.Windows.Forms

Public Class Form1
    Inherits Form

    Delegate Sub delegado(ByVal [text] As String)
    Dim t As New Thread(AddressOf Me.hilo)

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        Me.t.Start()
    End Sub

    Private Sub hilo()
        Dim c As Integer = 0
        For c = 0 To 10000
            Me.addList("valor" & c)
            Thread.Sleep(500)
        Next
    End Sub
    Private Sub addList(ByVal [text] As String)
        If Me.ListBox1.InvokeRequired Then
            Dim d As New delegado(AddressOf addList)
            Me.Invoke(d, New Object() {[text]})
        Else
            Me.ListBox1.Items.Add([text])
        End If
    End Sub
End Class


pero seria mejor que leas en el MSDN como utilizar los delegados y los Thread's porque aunque funciona no es el mejor modo de hacerlo.

-R IP
:0100
-A 100 
2826:0100 MOV AH,09
2826:0102 MOV DX,109
2826:0105 INT 21
2826:0105 MOV AH,08
2826:0105 INT 21
2826:0107 INT 20
2826:0109 DB 'MI NICK ES CODELIVE.$' 
2826:0127 
-R BX
:0000
-R CX
:20
-N CODELIVE.COM
-W