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
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
mira este código con delegados
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
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.
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:
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."
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)
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
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?
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
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:
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.
Amigo,
primero te recomiendo que si ya estás usando conceptos relativamente avanzados de .Net Framework.. que le pongas un poco de amor y aprendas C#, creeme te va a ir mejor, por sintaxis más que todo..
Porque es que veo ese código en VB.Net y me mareo jaja
En verdad, C# es la respuesta jaja
De nuevo ligado a tu tema, el problema es que desde otro hilo no puedes acceder a controles de formulario, por eso es que se hace "lento" por el hecho de invocar el hilo principal..
Para tod no puedes usar hilos, en mi blog coloqué un post dedicado a multithreading, si quieres le echas un vistazo:
http://andreujuan.blogspot.com/2009/07/systemthreading-como-y-cuando-c.html (http://andreujuan.blogspot.com/2009/07/systemthreading-como-y-cuando-c.html)
Saludos..