Spanish Nuevo por aqui, duda

mlc

Active Member
Licensed User
Longtime User
Hola, soy Miguel, llevo algún tiempo consultando cosas por aqui, pero nunca habia preguntado.
Tengo un problema, espero podais ayudarme.

Estoy recuperando la información de los contactos con la libreria Contacts2,

B4X:
                Dim Contacts2 As Contacts2
      Dim listOfContacts As List
      listOfContacts = Contacts2.GetAll(True,False)
      If listOfContacts.Size > 0 Then
         PanelContacts.Visible = True
         DoEvents
Dim i as Int
         For i = 0 To listOfContacts.Size - 1
         
            Dim pc As Int
            pc = (i * 100) / listOfContacts.Size
            If pc > 100 Then
               PbContacts.Progress = 100
            Else
               PbContacts.Progress = pc               
            End If
            
            Dim Contact As Contact
            Contact = listOfContacts.Get(i)
'                     Log(Contact) 'will print the fields to the LogCat               
            Dim emails As Map
            emails = Contact.GetEmails
'                     If emails.Size > 0 Then Log("Email addresses: " & emails)
            Dim phones As Map
            phones = Contact.GetPhones
'                     If phones.Size > 0 Then Log("Phone numbers: " & phones)
'            DoEvents
         Next   
         PanelContacts.Visible = False
end if

El problema es que si no pongo el doevents despues de cada registro la progressbar (PbContacts) no se actualiza y al usuario puede parecerle que la aplicación este frita. (por lo que he leido no es bueno utilizar doevents tantas veces)

Que puedo hacer para mostrarle algo al usuario sin utilizar Doevents ?

Gracias
 
Last edited:

NJDude

Expert
Licensed User
Longtime User
DoEvents debe ser utilizado cuando usas un loop que va a durar mucho tiempo, la razon es para evitar el "App not responding" error, en este caso, debes poner solo 1 DoEvents dentro de tu For...Next
B4X:
...
For i = 0 To listOfContacts.Size - 1

    Doevents

...

DoEvents permite que el UI sea actualizado, en este caso, de no poner DoEvents tu ProgressBar no se actualiza.
 

mlc

Active Member
Licensed User
Longtime User
Gracias

Hola NJDude y gracias.

Si, asi es como lo habia hecho, en el codigo que he mandado el doevents esta comentado,

La duda es que, si por ejemplo hay 1000 contactos, si es recomendable que se hagan 1000 doevents ? o si seria mejor hacer un doevents cada 10% o 20 %, etc

Gracias
 

joseluis

Active Member
Licensed User
Longtime User
DoEvents ralentiza mucho la operación, por lo tanto es mejor hacerlo no en cada iteración. Puedes llamarlo cada X iteraciones, o también creando un timer para que cada medio segundo lo llame...
 

mlc

Active Member
Licensed User
Longtime User
Resuelto

Gracias Jose Luis

Finalmente lo he resuelto con un timer, sin la necesidad de DoEvents y la barra de progreso se muestra bien en cada paso.
 
Top