Programación General > Visual Basic 6.0 e inferiores

 Hilo en VB6

(1/2) > >>

Azymuth:
Termine de programar un hilo en vb6 para hacer una serie de calculos sin que se me bloquee la pantalla de captura . . . para esto estoy utilizando el BackGroundWorker a partir de una com generado desde VB.NET que se da agregandolo como una referencia, el problema es que funciona si el programa lo corro desde visual studio 6 cuando lo compilo y me salgo de VB6 y corro el puro ejecutable me manda un error 91 el el cual me dice que la variable object no esta declara o el bloque width . . . el segmento de codigo es el siguiente

Private m_background As netfx20wrapper.BackgroundWorkerWrapper

Public Sub StartBackground(background As netfx20wrapper.BackgroundWorkerWrapper, argument As Variant)
    Set m_background = background
    m_background.RunWorkerAsync AddressOf BackGroundWork, argument
End Sub

StartBackGround es un procedimiento para lanzar el metodo de la clase netfx20wrapper.BackgroundWorkerWrapper llamado RunWorkerAsync el error se genera cuando ejecuta el metodo m_background.RunWorkerAsync con sus argumento  en ese momento manda el error '91' . He entrado a demas foros y nadie da una solucion al error '91' espero no entren novatos y algun experto me pueda decir como arreglar este problema. La variable background es un parmetro que mando a llamar desde otro lado el cual genero de la siguiente manera

Private WithEvents background As netfx20wrapper      
 Set background = New netfx20wrapper.BackgroundWorkerWrapper
 StartBackground background, "Estadistica"


Espero algun experto me diga como resolver este problema

Nebire:
Hola.

Yo no veo muy elegante exigir que te responda un experto en un foro donde todo el mundo aporta libremente sus ideas empeñando en ello su tiempo libre. Para poder exigir un experto, creo que lo adecuado es que contrates servicios técnicos, los pagues y ahí exige lo que te dé la gana. Si acudes vía gratuita, no te veo en ningún derecho de exigir otra cosa que sea el que se te trate con respeto. Si las respuestas que la gente te dé no te sirven simplemente la ignoras y listo.

Bueno yendo al tema.
Tu crees que el error está en 'm_background.RunWorkerAsync'  y yo digo que el error está (servido) antes, pero para salir de dudas, cacemos el momento... con un código como este...

' modifica el código como se ilustra.

--- Código: Visual Basic ---  Public Sub StartBackground(background As netfx20wrapper.BackgroundWorkerWrapper, argument As Variant)    Set m_background = background     if (m_background  is nothing) then        msgbox 'Mi objeto no ha sido creado... muy a mi pesar."    else        m_background.RunWorkerAsync AddressOf BackGroundWork, argument    end ifEnd Sub  
Cuando tengamos claro si el objeto se ha creado o no, veremos si con posterioridad tienes algún otro problema...

Aparte de todo esto, puedo preguntarte (y esperar respuesta) a la cuestión: si eres hispanoparlante y el objeto com lo has creado tú, y el usuario final pareces ser tu mismo (no una audiencia angloparlante) podrías decirme por qué usas términos en inglés ?.. de repente has olvidado el español ?. Sólo es curiosidad, si te importuna y no quieres responder no hay menoscabo por ello.

Azymuth:
Gracias . . . lo que pasa es que he navegado muchisimo y nadie ha podido responder a esta pregunta de cualquier manera te lo agradesco muchisimo pues me encuentro en una situacion muy desesperada te aviso como queda con el codigo que me sugeriste . . . MIL GRACIAS . . .

Muchas gracias por tu aportacion pero sigo en teniendo el mismo problema,estoy viendo la posibilidad de mandar a llamar un web service desde vb6 y usar el (BackGroundWorker)  "Trabajador de Fondo" para lograr mi objetivo a ver que pasa, o sea generar el web service desde Visual Studio NET usando la clase BackGroundWorker . . .

Nebire:
Puedes ser más explícito ?...

Te sigue marcando el error 91  o te sale el msgbox  o... ?

Si el objeto m_background está creado correctamente (no sale el mensaje) entonces lo que falla es el parámetro 'elargumento'. Dado que es un variant, puede contener cualquier cosa, si el error 91 se produce en base a él entonces queda claro que es un objeto, caza dicho parámetro del mismo modo que hemos probado el objeto...
Ten en cuenta que "estadistica" en vb 6.0 es un string, un tipo de variable estandar y en NET un string es un objeto.
Yo cuando utilizo un variant y éste ha de contener indistintamente un variable o un objeto utilizo una propiedad para hacer la asignación adecuada (ahora bien esto funciona perfectamente en VB 6.0, nunca lo he probado con tipos de datos  sobre NET) , de la sigiuente manera:

--- Código: Visual Basic --- private p_Argumento as Variant private get property Argumento as Variant   ' si lo que hay almacenado es un objeto la devolución 1ª falla y se produce el 'reintento'    on local error goto Reintenta         Argumento= p_Argumento          exit property     Reintenta:         set Argumento = p_Argumentoend property      private let property Argumento(byref ag as Variant)  ' espera un tipo de datos común, pero si se recibe un objeto, incurre en error y es reasignado desde el 'reintento'.             on local error goto Reintenta            p_Argumento= ag            exit property     Reintenta:           set p_Argumento = ag    end property         private set property Argumento(byref ag as Variant)  ' se espera un objeto pero si no se recibe, hará un 'reintento'...            on local error goto Reintenta            set p_Argumento= ag            exit property     Reintenta:           p_Argumento = ag        end property   
Ahora tu llamada deberá pasar por esa propiedad.... y la adjudicación deberá hacerse de acuerdo al tipo de datos que espera el objeto  netfx20wrapper.BackgroundWorkerWrapper


--- Código: Visual Basic --- Set background = New netfx20wrapper.BackgroundWorkerWrapper on local error goto Reintenta     Argumento= "Estadistica"    ' aquí le decimos que es un tipo de datos genérico    StartBackground background, ArgumentoReintenta:  Set Argumento= "Estadistica"    ' aquí le decimos que es un objeto.  StartBackground background, Argumento  

Ten en cuenta que si espera un objeto (para él el  'backgroundworker' una cadena es un objeto) no puedes pasarle otro tipo de datos si lo haces por referencia. Piensa que NET por defecto recibe parámetros por valor y VB 6.0 lo hace por referencia, asi tu función StartBackground  podría ser llamada directamente como lo tienes 'StartBackground background, "Estadistica"', si en ambas partes recibieras el parámetro por valor.

También como haces un addressof el error podría estar en´el método que hace de colector, 'BackGroundWork' del que no has expuesto nada, y del que suponemos que su firma será similar a:
sub BackGroundWork(byref Parametro as string) .

No obstante recibes un error del tipo ' se espera un objeto... y tu me estás pasando otra cosa...', por lo que se supone que uno de los 2 parámetros que recibe tu función 'StartBackground' es lo que de momento falla (una vez se arregle esto no significa que no se produzca otro error, pero al menos ya habríamos pasado del error 91). Como dices que en el entorno de programación paso a paso funcionaba hemos de suponer que hacía una conversión implícita de la que se ve desprovisto (Just In time) después...


En fin como no especificas nada, la situación se ramifica. Si no aportas detalles en tu respuestas, el diálogo es probable que termine sin apenas haberse establecido.

Azymuth:
Bueno quiero dar las gracias . . . pero no hubo una respuesta a mi pregunta . . .  :good:  :bravo: el proyecto lo tube que abandonar . . . y buscar otra solucion . . . en alguna ocacion pregunte como leer una huella digital desde un dispositivo de lectura de huellas digitales en otro foro y hasta este momento no he recibido una respuesta . . . tube que apoyarme con la API  que ya venia en el producto afortunadamente y sali del problema . . . muchas gracias  :clown:  :rolleyes:

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

Ir a la versión completa