Spanish Se ejecuta en Debug pero en Release falla

Johnny Wing Pérez

Member
Licensed User
Buenas Noches, alguno me podría decir, porque una aplicación que desarrollo en B4a en modo Debug trabaja perfectamente mi conexión JDBCSQL a mi BD MsSQL, pero al momento de compilar la aplicación (Release) las conexiones que no son asyncronas fallan y se cae la aplicación.
Como puedo ver ya en Release el error que se genera??

Gracias
 

José J. Aguilar

Well-Known Member
Licensed User
Hola Johnny:

Erel ha indicado ya en varios hilos que no deben usarse métodos síncronos para conectar a una base de datos externa, que el método correcto es hacerlo con wait for. Los métodos asíncronos no son tan rápidos, pero no afectan al hilo principal y no hacen que la aplicación se "congele".
De hecho, varias personas han reportado eso mismo, que funcionan en modo Debug pero no en modo Release. Hace poco alguien puso la explicación del por qué, pero no la encuentro ahora, creo recordar que es porque en modo Debug la aplicación se ejecuta en un sólo hilo, y en modo release ya es multi-hilo, así que supongo que tu conexión bloquea al resto y la app falla. En cualquier caso, en esos hilos la recomendación es siempre usar métodos asíncronos.

Además, la conexión SQL puede no estar activa indefinidamente, lo correcto es hacer una conexión cada vez que se conecte, usarla, y cerrarla.

En modo Release, si tienes B4A-bridge abierto, o si estás conectado en modo usb, deben verse los errores en el IDE (asegúrate de tener puesto #BridgeLogger: True en tu app). En Release verás los errores que da JAVA, en vez de los que da B4X, pero te darán una pista.
 

Johnny Wing Pérez

Member
Licensed User
Hola Johnny:

Erel ha indicado ya en varios hilos que no deben usarse métodos síncronos para conectar a una base de datos externa, que el método correcto es hacerlo con wait for. Los métodos asíncronos no son tan rápidos, pero no afectan al hilo principal y no hacen que la aplicación se "congele".
De hecho, varias personas han reportado eso mismo, que funcionan en modo Debug pero no en modo Release. Hace poco alguien puso la explicación del por qué, pero no la encuentro ahora, creo recordar que es porque en modo Debug la aplicación se ejecuta en un sólo hilo, y en modo release ya es multi-hilo, así que supongo que tu conexión bloquea al resto y la app falla. En cualquier caso, en esos hilos la recomendación es siempre usar métodos asíncronos.

Además, la conexión SQL puede no estar activa indefinidamente, lo correcto es hacer una conexión cada vez que se conecte, usarla, y cerrarla.

En modo Release, si tienes B4A-bridge abierto, o si estás conectado en modo usb, deben verse los errores en el IDE (asegúrate de tener puesto #BridgeLogger: True en tu app). En Release verás los errores que da JAVA, en vez de los que da B4X, pero te darán una pista.
Como siempre José muchas gracias, si había tenia la oportunidad de seguir algunos hilos de Erel, agradezco mucho tus recomendaciones, a veces es dificil encontrar todos los hilos en la comunidad. Gracias, ya retome el camino correcto.. de hecho los procedimientos que no son asincronos eran los que me fallaban.

Gracias
 

Johnny Wing Pérez

Member
Licensed User
Hola Johnny:

Erel ha indicado ya en varios hilos que no deben usarse métodos síncronos para conectar a una base de datos externa, que el método correcto es hacerlo con wait for. Los métodos asíncronos no son tan rápidos, pero no afectan al hilo principal y no hacen que la aplicación se "congele".
De hecho, varias personas han reportado eso mismo, que funcionan en modo Debug pero no en modo Release. Hace poco alguien puso la explicación del por qué, pero no la encuentro ahora, creo recordar que es porque en modo Debug la aplicación se ejecuta en un sólo hilo, y en modo release ya es multi-hilo, así que supongo que tu conexión bloquea al resto y la app falla. En cualquier caso, en esos hilos la recomendación es siempre usar métodos asíncronos.

Además, la conexión SQL puede no estar activa indefinidamente, lo correcto es hacer una conexión cada vez que se conecte, usarla, y cerrarla.

En modo Release, si tienes B4A-bridge abierto, o si estás conectado en modo usb, deben verse los errores en el IDE (asegúrate de tener puesto #BridgeLogger: True en tu app). En Release verás los errores que da JAVA, en vez de los que da B4X, pero te darán una pista.
José me podrias indicar, como le paso un parametro a una función asincrona, ya que lo estoy haciendo de esta forma, pero siempre me devuelve false:

Llamado a la función y le paso el valor:
    Wait For (CallSub(ModArticulo.DatosArticulo(Value),"DatosArticulo")) Complete (Result As List)
    Log(Result)
Esta es la sub que esta en el Modulo Articulos:
Public Sub DatosArticulo (Codigo As String) As ResumableSub
    Dim Datos As Articulo
    Datos.Initialize
    
    Dim sf As Object = Config.Sql1.ExecQueryAsync("mysql", "SELECT * FROM Articulos WHERE codigo = ?",Array As String(Codigo))
    Wait For (sf) mysql_QueryComplete (Success As Boolean, Crsr As JdbcResultSet)
    If Success Then
        Do While Crsr.NextRow
            Datos.Id=Crsr.GetInt("Id_articulo")
            Datos.Codigo=Crsr.GetString("Codigo")
            Datos.Nombre=Crsr.GetString("Descripcion")
            Datos.Precio=Crsr.GetDouble("Precio_Contado")
        Loop
        Crsr.Close
    End If
    Config.Sql1.Close
    Return Datos
End Sub
 

edgar_ortiz

Active Member
Licensed User
Johnny,

Creo que el problema es que devuelves la Variable "Datos" y "Datos" es de tipo "Articulo" y la sub-rutina devuelve un tipo "ResumableSub"

Saludos,

Edgar
 

Johnny Wing Pérez

Member
Licensed User
Johnny,

Creo que el problema es que devuelves la Variable "Datos" y "Datos" es de tipo "Articulo" y la sub-rutina devuelve un tipo "ResumableSub"

Saludos,

Edgar
Muchas Gracias, ya logre resolver el problema y la incógnita de como pasar los datos. Muy Agradecido, gracias Edgar por el comentario.
 

Johnny Wing Pérez

Member
Licensed User
Hola Johnny, me alegro de que lo solucionaras.
sería bueno que pongas la solución por si a alguien le pasa lo mismo y marques el hilo como solucionado.

saludos
Esta es la solución José

Primero cree una clase con los parámetros que necesito, luego por medio del metodo llamo al sub de guardar que esta en otro módulo y le paso los parametros
Llamado a la función GuardarMascota y le paso los datos de la clase:
Sub Button2_Click
    Dim Datos As Clases
    Datos.Initialize
    Datos.Id=TxtID.Text
    Datos.Nombre=TxtNombre.Text
    Datos.Raza=TxtRaza.Text
    Datos.Edad=TxtEdad.Text
    Wait For (EstadoConexion.GuardarMascota(Datos)) Complete (Resultado As Boolean)
    If Resultado=True Then
        ToastMessageShow("Registro exitoso",True)
    End If
    MostrarLista
End Sub
Este en el codigo de la función que recibe los datos
Función Guardar con los parametros enviados:
Sub GuardarMascota (Datos As Clases) As ResumableSub
    Wait For (ConexionSQL) Complete (Result As Boolean)
    If Result Then
        Sql.AddNonQueryToBatch("INSERT INTO Animales VALUES (?,?,?,?)", Array (Datos.Id,Datos.Nombre,Datos.Raza,Datos.Edad))
        Dim SenderFilter As Object = Sql.ExecNonQueryBatch("SQL")
        Wait For (SenderFilter) SQL_NonQueryComplete (Result As Boolean)
    End If
    CloseConexionSQL
    Return Result
End Sub
 
Top