Autor
|
Tema: Delegados en hilos... algo raro (Leído 11,146 veces)
|
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
|
|
|
En línea
|
|
|
|
MANULOMM
Desconectado
Mensajes: 559
Erepublik.com
|
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
|
|
|
En línea
|
|
|
|
Zzombi
|
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.
|
|
|
En línea
|
|
|
|
raul338
Desconectado
Mensajes: 2.633
La sonrisa es la mejor forma de afrontar las cosas
|
no se que version del visual studio estaras usando. pero yo usando la 2008, no me deja usar thread.sleep 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 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 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???)
|
|
« Última modificación: 18 Noviembre 2009, 22:12 pm por raul338 »
|
En línea
|
|
|
|
Zzombi
|
no se que version del visual studio estaras usando. pero yo usando la 2008, no me deja usar thread.sleep 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 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 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???) 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."
|
|
|
En línea
|
|
|
|
raul338
Desconectado
Mensajes: 2.633
La sonrisa es la mejor forma de afrontar las cosas
|
"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)
|
|
|
En línea
|
|
|
|
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
|
|
|
En línea
|
|
|
|
raul338
Desconectado
Mensajes: 2.633
La sonrisa es la mejor forma de afrontar las cosas
|
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?
|
|
|
En línea
|
|
|
|
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
|
|
|
En línea
|
|
|
|
43H4FH44H45H4CH49H56H45H
Wiki
Desconectado
Mensajes: 502
|
"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.
|
|
|
En línea
|
-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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Delegados Generales [Aporte]
.NET (C#, VB.NET, ASP)
|
Keyen Night
|
0
|
1,785
|
19 Febrero 2012, 22:59 pm
por Keyen Night
|
|
|
Los controles de la class principal no se actualizan con delegados... :-/
.NET (C#, VB.NET, ASP)
|
Eleкtro
|
7
|
3,854
|
21 Diciembre 2012, 07:11 am
por Eleкtro
|
|
|
Ayuda con delegados y objetos [C#]
« 1 2 »
.NET (C#, VB.NET, ASP)
|
Vaagish
|
10
|
6,267
|
24 Mayo 2014, 21:10 pm
por samuelhm
|
|
|
Hilos en python algo que no entiendo
Scripting
|
eliander20
|
2
|
3,145
|
21 Mayo 2017, 04:44 am
por tincopasan
|
|