Ver Mensaje Individual
  #13  
Antiguo 28-09-2023
dani36652 dani36652 is offline
Miembro
 
Registrado: abr 2019
Posts: 57
Reputación: 6
dani36652 Va camino a la fama
Cita:
Empezado por jhonalone Ver Mensaje
Muchas gracias. Dani.
Espero que la versión que hayas bajado sea la última.
Utilizo Delphi 11.0.
Algunos de los permisos nuevos, los he tenido que declarar en el Manifest directamente, porque no aparecen en la lista de Project>Options>Uses Permissions
La última versión funciona correctamente.
Archivo Adjunto 4120
Ahora tengo un problema nuevo: como el terminal (Android 13) tarda en encontrar los dispositivos, genera un error en el dispositivo de "PruebaBluetooth no responde" "Cerrar aplicación" "Esperar". Esto ocurren en Android 13, en otro terminal con Android 9 no ocurre. (También tarda un poco en detectar los dispositivos)

He desarrollado un simple programa para asegurarme de que el error depende de la espera y he confirmado que me salta el mismo error.
Código Delphi [-]
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, FMX.ListBox;

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
var
 I : Integer;
begin
  for I := 1 to 25
  do begin
       ComboBox1.Items.Add('Item Lento '+ I.ToString);
       Sleep(1000);
     end;

end;

end.

No sé como evitar el mensaje. Quizá abra un nuevo hilo para ver si alguien lo ha resuelto.
Un efusivo saludo.
Hola estimado... quizás eso se resuelva metiendo esa tarea "pesada" a un hilo en segundo plano evitando así que durante la tarea se te "congele" el hilo principal y el sistema operativo te indique que la app no responde.
Prueba algo como esto:

Código Delphi [-]
unit Unit1;

interface

uses
  System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,
  FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs,
  FMX.Controls.Presentation, FMX.StdCtrls, FMX.ListBox;

type
  TForm1 = class(TForm)
    ComboBox1: TComboBox;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.fmx}

procedure TForm1.Button1Click(Sender: TObject);
var
 ThreadSegPlano: TThread;
begin
  ThreadSegPlano:= TThread.CreateAnonymousThread(
  procedure 
  var 
    I : Integer; //Los contadores en hilos y procedimientos anonimos deben ser variables locales...
  begin
    for I := 1 to 25 do
    begin 
      //Siempre haz un Synchronize cuando modifiques el estado y propiedades de objetos visuales en este caso el Combo
      TThread.Synchronize(TThread.CurrentThread,
      procedure
      begin     
        ComboBox1.Items.Add('Item Lento '+ I.ToString);
      end);
      Sleep(1000); //Esta es tu tarea pesada, se le deja al hilo en segundo plano.....
    end;
  end);
  ThreadSegPlano.FreeOnTerminate:= True; //Liberar el hilo en memoria cuando termine
  //ThreadSegPlano.OnTerminate:= Aquí puedes asignarle un evento para cuando termine el hile como ocultar algun loading panel o mostrar un mensaje 
 // de carga finalizada, etc.
  ThreadSegPlano.Start;
end;

end.

Considero que en tu caso deberás meter el código de la búsqueda en un hilo en segundo plano pero no te olvides de hacer el synchronize a los objetos visuales...

Resumen para usar un hilo (Thread):

Código Delphi [-]
 procedure BtnClick(Sender: TObject);
 var 
   Thread: TThread; //Declaras el hilo
 begin
   Thread:= TThread.CreateAnonymousThread(
    procedure 
    begin 
      TareaPesada;
       TThread.Synchronize(TThread.CurrentThread,
       procedure 
       begin
         //Modificar Objetos visuales Ej. Label.Text:= 'Hola';
       end);
    end);  
   Thread.FreeOnTerminate:= True;
   Thread.Start;
 end;

Saludos cordiales!
Responder Con Cita