Error de acceso a memoria (no trabajo con memoria :S)

Iniciado por SERBice, 17 Junio 2008, 10:43 AM

0 Miembros y 1 Visitante están viendo este tema.

SERBice

Recibo el siguiente mensaje (aveces, no siempre) cuando ejecuto mi aplicacion (hecha en vb6 obviamente):




He localizado el posible origen del problema, pero aun no me explico porque sucede ni como solucionarlo.

La aplicacion crea un thread llamando a una funcion determinada que a su vez llama a la API URLDownloadToFile, descarga un archivo, analiza el contnido del archvo y ejecuta x accion segun el resultado del analisis.

En teoria no deberia corromper la memoria ni arrojar ningun error. He implementado una variable publica que es usada para prevenir la creacion de dos thread simultaneos (dado que el id del thread se almacena en una variable y si se ejecutara un segundo thread sobreescribiria el id dl primero y "se perderia" su id, no permitiendo matarlo luego)

Al finalizar la aplicacion el thread es matado en caso ed qeu siga en ejecucion. Pero repito, el problema paerce darse al crearse el thread por primera vez (cuando se ejecuta la aplicacion se lanza tl thread y luego se hace ciclicamente con un timer, comprueba informacion disponible en un sitio web).

Notese que el error no es siemper, sino aveces, quizas sea bajo ciertas condiciones del entorno que no suelen darse, pero cuando se dan... chau aplicacion. Otra cosa curiosa es que la aplicacion sigue funcionando bien, si no se acepta el msgbox de error la app sigue corriendo bien, solo se cuelga el thread.

¿Alguien sabe a que se debe y/o como solucionarlo?.

PD: me es necesario usar el thread para no "colgar" la aplicacion por unos instantes (aveces variso segundos dependiendod e la conexion), ddo qu la api URLDownloadToFile "se cuelga" hasta terminar la descarga, utilizando un thread la aplicacion sigue sin notarse ningun cuelgue. No uso winsock por una cuestion de compatibilidad con los SO y simpleza en la aplicacion (podria usar winsock por api pro es mucho codigo para un simple checkeo, y el inet control no me termina de convencer).


Desde ya muchas gracias.

~~

Pues adivinos no somos, pega un trozo del código donde te da el error (usa el debugger). Aunque el fallo tiene toda la pinta de ser por que creas mal el hilo, fíjate que intentas acceder a la posición 0x000.. y ahí no hay nunca nada :P

Debuggea para ver si el hilo se crea o no. Yo creo que va a ser eso, pero sin ver código imposible saberlo...

Salu2

SERBice

a ver... no intento acceder a ninguna posicion de memoria, ahi esta el problema.

simplement creo un thread que dscarga un archivo usando api, y arroja ese error (no siempre, esto es lo más curioso).

el thread es creado de la unica forma posible, no hay buena o mala, solo hay una:
Código (vb) [Seleccionar]
        hThread = CreateThread(ByVal 0&, ByVal 0&, AddressOf AsyncThread, ByVal 0&, ByVal 0&, hThreadID)


donde AsyncThread es la funcion qu descarga el archivo en cuestion usando la API URLDownloadToFile


Código (vb) [Seleccionar]
Private Declare Function URLDownloadToFile Lib "urlmon" Alias _
"URLDownloadToFileA" (ByVal pCaller As Long, ByVal szURL As String, ByVal _
szFileName As String, ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long



es por esto que posteo preguntando, porque no hay forma de que yo este tratandod e acceder a memoria, mucho menos  una posicion invalida (0x0 es una posicion del sistema)... asi qeu no cmoprendo, este error me tiene algo loco.... no dberia estar allí.

Lambda

visual basic no esta diseñado para ser MultiThread, se pueden usar pero dan muchisimos problemas

~~

Citara ver... no intento acceder a ninguna posicion de memoria, ahi esta el problema.

simplement creo un thread que dscarga un archivo usando api, y arroja ese error

Cualquier programa accede constantemente a posiciones de memoria, y el tuyo no es una excepción, además por el propio funcionamiento de CreateThread tienes que acceder a la posición de memoria de hThreadID, de ahí que tenga que ser un puntero, pero claro en Vb...

Prueba esto, dale a hThreadID el valor 5 antes de llamar al api (hThreadID = 5) y luego ejecútalo, a ver que valor hexadecimal te sale en el mensaje de error... (si subieras un poco de code no tendríamos que andar con estas..)

Citardonde AsyncThread es la funcion

Una función o un sub? como lo tienes declarado??

De todas formas los hilos en VB6 siempre te van a dar problemas...
Salu2

cobein

Podrias implementar IBindStatusCallback para que no se congele, pero no tiene mucho sentido.

http://www.advancevb.com.ar
Más Argentino que el morcipan
Aguante el Uvita tinto, Tigre, Ford y seba123neo
Karcrack es un capo.

SERBice

#6
AsyncThread es una Sub publica.
CitarPublic Sub AsyncThread()


Lo que me resulta llamativo es que el programa crea 2 threads, y solo este me da problemas, ahroa estoy mirando en el codigo a ver si hay algo diferente entre ambos.


EDIT:

Citarsi subieras un poco de code no tendríamos que andar con estas.

es una simple creación de un thread que llama a una sub que usa una api la cual ya he dicho, cualqueira puede reproducir el error con un poco  ganas.... no se porque la insistencia con el code ¬¬


estableciendo hthreadid en 5 da el mismo error.


cobein, como es eso de usar IBindStatusCallback  ???

ah, y un OT para cobein jeje.... has hecho algo sobre el tema de ocultar un exe dentro de otro e inyectarlo desde un byte array????.... me interesa mucho jeje

EDIT2: He usado como base para la creación del thread un ejemplo del apiguide

EDIT3: Dato importante, el error hasta ahora solo lo he visto en Windows XP con SP2, probe en Win98 SE y no arroja errores (raro, porque Win98 es muy "quisquilloso" con la memoria).

Dentro de unas horas probate con XP SP3, y Vista Ultimate (sin SP)

EDIT4: al parcer el error solo ocurre cuando se llama por primera vezal thread desde el form-load, luego no ocurre cuando es llamado por un timr que ejecuta el thread cada x minutos. el error no sale siempre, solo aveces cuando se ejecuta la aplicacion. Si no se acepta (ni cancela) el error del thread la aplicacion continua funcionando hasta qeu se cierre el mnsaje del error que genero el thread.... algo raro.

SERBice

bueno, lo he "solucionado".... el error se producia/produce al llamar/crear el thread desde el form_load... aun no me explico que  podria llegar a estar interfiriendo..... pero bueno, he dejado de llamar/crear al thread desde el form_load y ahora solo lo hago con el timer. Hasta ahora n hay ningun problema.

Agradezco a todos su colaboracion y si alguin supiera el porque de este error desacbellado seria bueno que lo comparte, solo como una curiosidad y dato a futuro dado qeu ya lo he "solucionado"... aunqu en realidad no es una solucion, sino una omision de su origen :p.....


nuevamente muchas gracias.

saludos.