Test Foro de elhacker.net SMF 2.1

Programación => .NET (C#, VB.NET, ASP) => Programación General => Programación Visual Basic => Mensaje iniciado por: W0lFy en 29 Marzo 2010, 14:40 PM

Título: Threads en VB
Publicado por: W0lFy en 29 Marzo 2010, 14:40 PM
Buenas, estoy haciendo una pequeña aplicacion en VB pero se queda aparentemente colgada debido a que el bucle es demasiado lento, porque recorre unos 150000 registros, intento llevar un co0ntrol mediante una progress bar, y parece funcionar mas o menos bien pero la ventana del formulario se queda un poco colgada, existe alguna manera de ejecutar esta accion sin que  afecte al formulario principal? es mediante Threads? Un saludo
Título: Re: Threads en VB
Publicado por: skyweb07 en 29 Marzo 2010, 15:29 PM
Podrias utilizar un DoEvents cada vez que pasas un registro para que se le quite un poco el colgamiento pero no se me ocurre otra cosa... Al no ser... ¿Usas ADO o MySql?
Título: Re: Threads en VB
Publicado por: j@son en 30 Marzo 2010, 03:35 AM
Buenas,
Esta página la he encontrado buscando por google.

Cito:
[...]
La utilización de Multithreading en VB6 no está recomendado ni soportado. No
obstante, existen artículos en Internet que muestran su utilización. Uno de
los mejores es el siguiente:

A Thread to Visual Basic: Multi-Threading In VB5 and VB6
http://www.freevbcode.com/ShowCode.asp?ID=1287 (http://www.freevbcode.com/ShowCode.asp?ID=1287)
[...]

En .NET, ésto ya no es problema ;-)

saludos.
Título: Re: Threads en VB
Publicado por: W0lFy en 30 Marzo 2010, 08:20 AM
encontre este codigo, bueno... antes de ver el post, lo unico que no funciona me salta el siguiente error

Uso invalido de Address of !!

Código (vb) [Seleccionar]
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public hThread As Long, hThreadID As Long

Private Sub Command1_Click()
    'KPD-Team 1999
    'URL: http://www.allapi.net/
    'E-Mail: KPDTeam@Allapi.net
    'After you click this button, try to move the window
    'You will see that the AsyncThread-function was executed asynchronously
    hThread = CreateThread(ByVal 0&, ByVal 0&, AddressOf AsyncThread, ByVal 0&, ByVal 0&, hThreadID) ' en esta linea me da el error en Address OF
    CloseHandle hThread
End Sub

Private Sub Form1_Unload(Cancel As Integer)

    'If the thread is still running, close it
    If hThread <> 0 Then TerminateThread hThread, 0

End Sub

'In a module



Function AsyncThread() As Integer

    'Let this thread sleep for 10 seconds

    Sleep 10000
    hThread = 0

End Function



Que ocurre? Un saludo
Título: Re: Threads en VB
Publicado por: BlackZeroX en 30 Marzo 2010, 09:04 AM

Código (vb) [Seleccionar]

'In a module



Function AsyncThread() As Integer

    'Let this thread sleep for 10 seconds

    Sleep 10000
    hThread = 0

End Function


Ojo es es un modulo.

Sangriento Infierno Lunar!¡.
Título: Re: Threads en VB
Publicado por: W0lFy en 30 Marzo 2010, 09:29 AM
es verdad tienes razon, al compilar.... si ejecuto el EXE me tira un error..... y no sigue ejecutando... te pongo el codigo

Código (vb) [Seleccionar]
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Private Declare Function CreateThread Lib "kernel32" (lpThreadAttributes As Any, ByVal dwStackSize As Long, ByVal lpStartAddress As Long, lpParameter As Any, ByVal dwCreationFlags As Long, lpThreadID As Long) As Long
Private Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Public hThread As Long, hThreadID As Long

Private Sub Command1_Click()
   hThread = CreateThread(ByVal 0&, ByVal 0&, AddressOf AsyncThread, ByVal 0&, ByVal 0&, hThreadID)
   CloseHandle hThread
End Sub




Private Sub Form_Unload(Cancel As Integer)
   If hThread <> 0 Then TerminateThread hThread, 0
End Sub

'in a module

Public Sub AsyncThread()

  For i = 1 To 5
  MsgBox i
  Next
  hThread = 0
 
End Sub

Título: Re: Threads en VB
Publicado por: Debci en 30 Marzo 2010, 10:45 AM
Aprende C++ o java  :D

Saludos
Título: Re: Threads en VB
Publicado por: BlackZeroX en 30 Marzo 2010, 23:16 PM
Cita de: ..::| D3Bć1 |::. en 30 Marzo 2010, 10:45 AM
Aprende C++ o java  :D

Saludos

En lugar de java mejor c/c++ java usalo si te lo exigen otros... pero por mi parte y de forma personal mejor c/c++, esto por lo de la VM de java, aun que a las empresas con sus PC chafas como en Telecom les importa una ***** y piden java para ss sitemas... tardan años en ejecutar sus aplicacione (Experiencia propia).

Sangriento Infierno Lunar!¡.
Título: Re: Threads en VB
Publicado por: W0lFy en 31 Marzo 2010, 09:18 AM
Citar
Aprende C++ o java

si realmente se programar en C/c++  o java, sólo que hice la aplicación en VB porque estaba orientada a BBDD de lotus y el codigo de VB es similar al de LOTUS,la proxima vez empezare el proyecto en C/C++ y todo perfecto, por cierto...odio java. ;).

Simplemente lo quiero por estética, pero si no se puede tampoco lo realizo, lo unico que quiero es que haga en 2º plano un bucle que es bastante grande, donde tiene una funcion de busqueda que tiene tambien un bucle bastante grande, entonces digamos que si quiero hacer esto:

Código (vb) [Seleccionar]
sub funcion1(indice as string,max as long,BBDD as EstructuraDatos,PB1 as progressbar)

PB1.value=0
for i=1 to max 'max = 150000
busca(indice,BBDD) '-> esta funcion tiene un bucle for de 1 hasta 145000 tambien.
PB1.value=PB1.value +1
next
End sub


pos lo unico que quiero es realizar la funcion1 en 2º plano, ya que el formulario se queda "Colgado" al ser una operación que lleva tanto tiempo, para que estéticamente la progressbar se vaya incrementando y el formulario no tenga el aspecto de "colgado" (No Responde)que se produce cuando un programa realiza un algoritmo muy grande, porque se queda con la ventana del form en blanco... hasta que realiza el algoritmo por completo.

Si existe solución me gustaría saberla, hasta ahora he utilizado la API de createThread y no parece funcionar muy bien en VB, o realmente no la he implementado bien, alguien podría ayudarme?
Título: Re: Threads en VB
Publicado por: seba123neo en 1 Abril 2010, 21:10 PM
Hola, quisiera saber cual es el probelma principal, o sea el "porque" de que te tarde tanto procesar esos registros ¿podes poner el codigo de esos registros?...porque capas estas haciendo algo mal ahi...y procesar esa cantidad de registros no debe haber problemas...hay procesos que procesan mas registros y no usan thread para nada.

saludos.
Título: Re: Threads en VB
Publicado por: W0lFy en 5 Abril 2010, 07:25 AM
Citar
Hola, quisiera saber cual es el probelma principal, o sea el "porque" de que te tarde tanto procesar esos registros ¿podes poner el codigo de esos registros?...porque capas estas haciendo algo mal ahi...y procesar esa cantidad de registros no debe haber problemas...hay procesos que procesan mas registros y no usan thread para nada.

si quieres pongo aqui mi cogido y le hechais un vistazo, lo unico para lo que quiero los threads es por estetica, para que el formulario no se quede en modo "No Responde" al ser una operación tan grande:


Código (vb) [Seleccionar]
Function AsignaOperaciones(fileName As String, ByRef matriz As totalExpedientes, PB1 As ProgressBar) As Integer
Dim file As Integer
Dim linea As String
Dim lineaGestion As String
Dim vDatos As Variant
Dim indice As Long
Dim gestion As Double
Dim encontrado As Boolean
file = FreeFile
PB1.Min = 0
PB1.Max = 149000
Open fileName For Input As #file
   Do Until EOF(file)
       Line Input #file, linea
       vDatos = Split(linea, "*")
       gestion = 0
       indice = BuscaExpediente(Val(vDatos(0)), matriz, encontrado)
       lineaGestion = vDatos(2)
       
       If encontrado Then
           If matriz.expedientes(indice).gestion <> "" Then
               gestion = matriz.expedientes(indice).gestion
           Else
               gestion = 0
           End If
           matriz.expedientes(indice).TipoOperacion = vDatos(1)
           matriz.expedientes(indice).gestion = gestion + CalculaSaldos(lineaGestion)
           matriz.expedientes(indice).Asignacion = vDatos(3)
           matriz.expedientes(indice).Defectuosa = vDatos(4)
           matriz.expedientes(indice).Subsanada = vDatos(5)
           matriz.expedientes(indice).Anulada = vDatos(6)
        End If
       
       
       
       
       If PB1.Max <> PB1.Value Then
               PB1.Value = PB1.Value + 1
       End If
       
   Loop
Close #file
PB1.Value = 0
End Function


esto es una función, y la función BuscaExpediente es la siguiente:

Código (vb) [Seleccionar]
Function BuscaExpediente(numExp As String, matriz As totalExpedientes, ByRef bandera As Boolean) As Long
bandera = False
   For i = 0 To matriz.numExpedientes - 1 Step 1
       If numExp = matriz.expedientes(i).Expediente Then
           bandera = True
           BuscaExpediente = i
           Exit Function
       End If
   Next
BuscaExpediente = -1
End Function


la estructura totalExpedientes es la siguiente

Código (vb) [Seleccionar]
Type EstructuraExpediente
   Expediente As String
   FechaFirma As String
   Procedencia As String
   FechaFactura As String
   Debe As String
   Haber As String
   Saldo As String
   TipoOperacion As String
   gestion As String
   Defectuosa As String
   Subsanada As String
   Asignacion As String
   Anulada As String
End Type
Type totalExpedientes
   expedientes() As EstructuraExpediente
   numExpedientes As Long
End Type


En resumen, mi funcion buscaExpedientes realiza un bucle bastante grande,
y la funcion de AsignaOperaciones abre un archivo que contiene 150000 lineas con lo cual tiene que recorrer 150000 lineas y buscar en la matriz el correspondiente expediente para asignarle valores de la linea(cada linea corresponde a un expediente). Espero haberme explicado.. :)
Un saludo y Gracias!
Título: Re: Threads en VB
Publicado por: Karcrack en 5 Abril 2010, 17:32 PM
Con DoEvents y/o Sleep(0) debe sobrar para que no se te laggee la interfaz... Estos has de ponerlos dentro del For...
Título: Re: Threads en VB
Publicado por: W0lFy en 15 Abril 2010, 09:14 AM
Citar
Con DoEvents y/o Sleep(0) debe sobrar para que no se te laggee la interfaz... Estos has de ponerlos dentro del For...
gracias Karcrack no pensé que era tan facil... jeje ;)