Duda acerca de Visual Basic

Buenos días, estoy terminando mi proyecto final de carrera, una aplicación en Visual Basic y me surge la siguiente duda:
Estoy usando desde VB funciones de una Dll creada en C++. Como estas funciones tardan bastante en ejecutarse he puesto antes y después de cada linea de llamada a estas funciones la palabra Doevents (con esto le doy el control al sistema operativo, porque si no lo hago muchas veces como las funciones tardan bastante VB se cuelga). Lo que pasa entonces es que si durante la ejecución de esta función quiero interaccionar con la interfaz de VB y cliko en algún punto de la interfaz se pone en blanco la pantalla como si se hubiera colgado y permanece así hasta que finaliza la función en curso que se está ejecutando.
¿Cómo puedo solucionar esto de una mejor manera? (Alguna manera de repintar la interfaz para que no quede en blanco hasta que la función acabe)
mi correo es [email protected]
Muchas gracias de antemano y si tienes alguna duda de mi pregunta estaría muy agradecida si me escribieras.

5 Respuestas

Respuesta
1
Creo entender todo, el problema es que el doevents y similar lo que hace es en el momento que se ejecuta dar la prioridad al sist. Operativo. En un bucle eso esta fantástico, pero en tu ejemplo no porque vos lo ejecutas antes y después de una función que tarda mucho tiempo y esa función al ser "externa" al código del programa no abarca el doevents.
Más gráfico:
sub.....
doevents
call ('funcion que tarda')
doevents
end sub
Ahí estas haciendo que antes de la función y después de la prioridad al sist. Op.. Si el código de la función estaría en tu programa linea por linea ahí si podes manejar la prioridad.
Lo que podes hacer es obtener el fuente de la dll (cosa casi imposible si es que no sabes su procedencia) o sino intentar hacer vos mismo las funciones de la dll, sino imposible.
Respuesta
1
La dll ue comentas es hecha por ti o por alguna otra persona, porque lo que se pudiera hacer es que el proceso de la dll mandará un mensaje o una barra de avance del proceso y que se pueda monitorear en pantalla, o cambiar la funcionalidad de la dll a tu proyecto y generar una dll pero de visual en la que puedas interactuar con la barra de avance, porque de otra forma no se puede. Ya que estás esperando resultados de otra aplicación, si fuera un ejecutbale podría se una llamada asíncrona, pero con la dll, quien sabe si se pueda.
Respuesta
1
Para esto yo uso me. Refresh dentro de un bucle de lecturas de una BD, fichero,...
El problema es que tu no tienes un bucle como tal, ¿verdad?
Podrías poner el "me.refresh" en el evento timer de un control timer para que se ejecute cada cierto tiempo.
En el punto en el que llames a la función activa el timer, para que empiece a trabajar y desactívalo al terminar la función c++.
Pruébalo y me dices...
Respuesta
1
Necesitaría saber un par de cosas antes de poder darte una solución como por ejem`lo, si las funciones que utilizan las dll's están llamadas desde alguna función en un módulo y directamente del código del formulario, por otro lado, si no es así yo te recomendaría que crees tu propia dll con las funciones de una forma optimizada.
De cualquier modo, si querés explicame lo que hace la función del dll y yo te la trato de optimizar para que dure menos y no tengas que usar DoEvents.
Atentamente. Manuel Fernández.
Muchas gracias por tu respuesta, me encantaría contarte lo que hacen estas funciones de C++ pero son algoritmos muy específicos para restauración de películas antiguas y hay varios restauradores trabajando en optimizar estas en cuanto a recursos computacionales se refiere!
Las dll´s las llamo desde código de formulario.
POr lo que deduzco, ¿poco más puedo hacer no? ¿?
uN saludo. Y muchas gracias
Voy a hacer algunas pruebas, si tengo éxito te lo voy a comunicar a la brevedad.
Atentamente. Manuel Fernández.
Muchísimas gracias. Espero tu respuesta. Un saludo.sole
Avisame si tenés alguna fecha en especial, porque no te quiero demorar.
Atentamente. Manuel Fernández
Respuesta
1
Pues sin ánimo de decepcionarte, tengo que decirte que no, mientras se está ejecutando la función toda tu aplicación queda "en espera". Digamos que cualquier función es "indivisible" y VB no procesa eventos a mitad de ejecutar ninguna (excepto código VB con instrucciones DoEvents por medio).
La única solución sería que hicieses tu aplicación multihilo (multithread) y ejecutaras el trozo que incluye las funciones C en un hilo independiente.
¡Ojo! VB no está diseñado nativamente para el uso de estas técnicas, no es sencillo implementarlas y, probablemente, ni siquiera te merezca la pena. En cualquier caso, te pongo un enlace donde puedes formarte en esta técnica:
http://www.freevbcode.com/ShowCode.Asp?ID=1287
No olvides valorar la respuesta.

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas