Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > FireMonkey
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 10-07-2020
(MAJ) (MAJ) is offline
Miembro
 
Registrado: abr 2007
Posts: 71
Poder: 18
(MAJ) Va por buen camino
exception al llenar listview en anonymousthread

Buenas a todos. estoy teniendo un problema al un listview en un anonymousthread el thread en android(fmx) ejecuta una consulta rest, y el resultado lo quiero cargar en un listbox con un ciclo for, pero el listbox, despues de cargarlo me da una excepcion access violation, intente poner la creacion de los items en threadsynchronize, intente poner el for dentro del synchronize pero en todos me da un acessviolation, si alguien pudiera ayudarme le agradeceria


Código Delphi [-]
  

     for s in LDirs do

        tthread.Synchronize(nil,
          procedure
          var
          s:string;
          begin
            lboxDirectorio.BeginUpdate;
            lboxDirectorio.Items.Add(TPath.GetFileName(s) + CONST_X);
            lboxDirectorio.EndUpdate;
            application.ProcessMessages;
          end);
mas o menos ese es el codigo que utilizo para llenar el listview
__________________
Código Delphi [-]
//Inserte una firma aquí...
Responder Con Cita
  #2  
Antiguo 10-07-2020
bucanero bucanero is offline
Miembro
 
Registrado: nov 2013
Ubicación: Almería, España
Posts: 208
Poder: 11
bucanero Va camino a la fama
hola a todos

en tu código veo varios cosas que te pueden dar erroes:
-pones el BeginUpdate / EndUpdate dentro del hilo y dentro del bucle, por lo que se repite en cada ciclo, cuando solo es necesario hacerlo una vez al principio y al final del proceso.
-Por otra parte, haces un application.ProcessMessages también dentro del hilo... si ya tienes un hilo secundario, el processMessages no es necesario, y de hacerlo hazlo en el hilo principal.

A mi este código me funciona bien:
Código Delphi [-]
procedure TForm2.ShowFiles(LDirs: TStringDynArray);
begin
    // Se pone el listBox en modo Update fuera del hilo
  lboxDirectorio.Items.BeginUpdate;
    // Se crea el hilo de proceso
  with TThread.CreateAnonymousThread(
    procedure
    var
      s: string;
    begin
        //...
      for s in LDirs do
        lboxDirectorio.Items.Add(TPath.GetFileName(s) + CONST_X);
        //...
    end) do begin
      //se marca para que termine de forma automatica
    freeOnTerminate := true;
      //se asigna el proceso que tiene que hacer cuando termine
    OnTerminate := ThreadTerminate;
      // se inicia el hilo
    start;
  end;
end;

procedure TForm2.ThreadTerminate(sender: TObject);
begin
  // al finalizaz el hilo se pone el listBox en modo normal
  lboxDirectorio.Items.EndUpdate;
  SetLength(Files, 0);
end;

procedure TForm2.Button1Click(Sender: TObject);
begin
  files := TDirectory.GetFiles('c:\a');
  ShowFiles(files);
end;

En este ejemplo en particular no utilizo tthread.Synchronize, a pesar de ser lo recomendable para actualizar un componente visual, pero en este ejemplo en particular solo escribe un único hilo de forma secuencial y no debe de dar problemas. En caso de usar varios hilos para actualizar el componente entonces si es ya necesario.
Responder Con Cita
  #3  
Antiguo 13-07-2020
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.549
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
El Synchronize es obligatorio a utilizar en todos los Threads en el momento que acceder a un elemento que no sea "thread-safe", como son los componentes de la VCL.
Independientemente de si tú creas varios hilos o sólo uno, porque aunque tú sólo crees uno, hay otro que siempre está funcionando, que es el "Main thread" (el principal de la aplicación). Por lo tanto. debería utilizarse siempre.

Cita:
Empezado por bucanero Ver Mensaje
En este ejemplo en particular no utilizo tthread.Synchronize, a pesar de ser lo recomendable para actualizar un componente visual, pero en este ejemplo en particular solo escribe un único hilo de forma secuencial y no debe de dar problemas. En caso de usar varios hilos para actualizar el componente entonces si es ya necesario.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #4  
Antiguo 13-07-2020
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.549
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por (MAJ) Ver Mensaje
...mas o menos ese es el codigo que utilizo para llenar el listview

Dos cosas:
  1. Yo haría una prueba sencilla para descartar, utilizando un thread "normal" (que no sea anónimo). Debería funcionar igual, pero para descartar algun problema con eso.
  2. Comentas en tu mensaje, que el código "...más o menos es este". Yo no lo veo problema a este mensaje, pero si tu código no es exactamente este, tal vez no estemos viendo lo que te está dando problemas.
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.
Responder Con Cita
  #5  
Antiguo 26-08-2020
(MAJ) (MAJ) is offline
Miembro
 
Registrado: abr 2007
Posts: 71
Poder: 18
(MAJ) Va por buen camino
Cita:
Empezado por Neftali [Germán.Estévez] Ver Mensaje
Dos cosas:
  1. Yo haría una prueba sencilla para descartar, utilizando un thread "normal" (que no sea anónimo). Debería funcionar igual, pero para descartar algun problema con eso.
  2. Comentas en tu mensaje, que el código "...más o menos es este". Yo no lo veo problema a este mensaje, pero si tu código no es exactamente este, tal vez no estemos viendo lo que te está dando problemas.
en un thread normal es lo mismo, y es "mas o menos", porque en el codigo que utilizo, tengo otras variables y procedimientos que no van al caso
__________________
Código Delphi [-]
//Inserte una firma aquí...
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Arithmetic exception NickName Firebird e Interbase 5 12-12-2022 23:14:12
Llenar listview desde archivo web paquechu FireMonkey 2 13-09-2018 21:15:37
¿Como llenar un listview con datos seleccionados de un DBlookuplistbox? eduarcol OOP 1 11-08-2007 03:47:06
exception arieliten Conexión con bases de datos 3 21-04-2005 01:27:59
Arithmetic Exception NickName Firebird e Interbase 4 13-09-2004 18:00:42


La franja horaria es GMT +2. Ahora son las 01:43:32.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi