Ver Mensaje Individual
  #5  
Antiguo 09-10-2023
dani36652 dani36652 is offline
Miembro
 
Registrado: abr 2019
Posts: 61
Reputación: 6
dani36652 Va camino a la fama
Hola, claro que si se puede. Solo que si dicha variable es utilizada por otros hilos más, te recomiendo meter esa asignación en un "Synchronize" todo esto para evitar errores de acceso de memoria o errores de acceso múltiple.

Revisando tu código, hice algunas correcciones y te hago de forma constructiva las siguientes observaciones.
  • Los cambios dados a componentes visuales dentro de otros hilos que no sean el hilo principal, deben ir dentro de un Synchronize.
  • Los mensajes, cuadros de diálogo y cambios en variables globales, de igual forma van dentro de un Synchronize.

Observé también que mostrabas mensajes y después hacias un exit; puedo intuir que no apreciabas el cambio del valor de la variable por que en algún punto tu app caía en las líneas que mostraban mensajes pero como no sincronizabas con el hilo principal, no se veía nada y no cambiaba la variable por el exit antes mencionado.

Te dejo más o menos cómo quedaría tu código y como comentario final, no olvides que la impresión tanto en Android como en Windows siempre debe llamarse en el Hilo principal.
Si haces eso desde otro hilo aplica algo como esto para que se ejecute en el hilo principal
Código Delphi [-]
TThread.Synchronize(nil,
procedure
begin
  Imprimir;
end);

//Tu código

Código Delphi [-]
(*-----------------------------------------------------------------*)
procedure ImpresoraConectada;
procedure ImpresoraLista;

{ Private declarations }
private
  Impresora : TBluetoothDevice;
  FSocket: TBluetoothSocket;
  BluetoothAdapter: TBluetoothAdapter;
  FBluetoothManager : TBluetoothManager;
  ServiceGUI : String;
  Guid :  TGUID;
  ServiceName : String;
  ResultadoImpresora : Boolean;// Lleva el resultado de ImpresoraConectada
{ Public declarations }
public
end;

var
  Presu: TPresu;

implementation
(*----------------------------------------------------------------------*)
procedure TPresu.ImpresoraLista;
var
 Thread: TThread;
begin
  (*
  TThread.ForceQueue(TThread.CurrentThread,
  ImpresoraConectada)
  Esto no es correcto, ya que estás poniendo en cola la llamada al método y por ende
  no se actualiza el valor de la variable cuando es esperado.*)
  Thread:= TThread.CreateAnonymousThread(
  procedure
  begin
    ImpresoraConectada;
  end);

  Thread.FreeOnTerminate:= True;
  Thread.Start;
end;

procedure TPresu.ImpresoraConectada;
var
  Msg: string;
  I, B: Integer;

  ListaVinculados: TBluetoothDeviceList;
  LServices: TBluetoothServiceList;
begin
  (*ES LA VARIABLE GLOBAL DE LA TFORM QUE NO SE MODIFICA DESPUES DE TERMINAR EL TTHREAD
  SI REPITES EL TTHREAD TERMINA CAMMBIANDO*)
  TThread.Synchronize(TThread.CurrentThread,
  procedure
  begin
    ResultadoImpresora := False;
  end);

  try
    FBluetoothManager := TBluetoothManager.Current;
    if not Assigned(FBluetoothManager) then
    begin
      TThread.Synchronize(TThread.CurrentThread,
      procedure
      begin
        Mensaje(Form1.NoCodi(ST.Strings[79]), 0);
      end;
      Exit;
    end;

    FBluetoothManager.SocketTimeout := 100;

    BluetoothAdapter := FBluetoothManager.CurrentAdapter;
    if not Assigned(BluetoothAdapter) then
    begin
      TThread.Synchronize(TThread.CurrentThread,
      procedure
      begin
        Mensaje(Form1.NoCodi(ST.Strings[80]), 0);
      end);
      Exit;
    end;

    ListaVinculados := FBluetoothManager.GetPairedDevices(BluetoothAdapter);
    if not Assigned(ListaVinculados) then
    begin
      TThread.Synchronize(TThread.CurrentThread,
      procedure
      begin
        Mensaje(Form1.NoCodi(ST.Strings[81]), 0);
      end);
      Exit;
    end;

    // DeviceElegido es la posición de la impresora en ListaVinculados
    Impresora := ListaVinculados[DeviceElegido] as TBluetoothDevice;
    if Impresora.IsPaired then
    begin
      LServices := Impresora.GetServices;
      for B := 0 to LServices.Count - 1 do
      begin
        ServiceGUI := GUIDToString(LServices[b].UUID);
        Guid := LServices[b].UUID;
        ServiceName := LServices[b].Name;
      end;
    end
    else
    begin
      TThread.Synchronize(TThread.CurrentThread,
      procedure
      begin
        Mensaje(Form1.NoCodi(ST.Strings[82]), 0);
      end;
      Exit;
    end;

  except
    on E: Exception do
    begin
      Msg := E.Message;
      (*Recuerda que todo lo visual y referente a la interfaz de usuario
      (cuadros de diálogo, texto de labels, botones, etc.) así como
      variables globales que puedan ser modificadas por otros hilos, deberán meterse
      en un Syncrhonize*)
      TThread.Synchronize(TThread.CurrentThread,
      procedure
      begin
        Mensaje('Error al Conectar el Software de la Impresora: ' + Msg, 0);
      end);
      Exit;
    end;
  end;

  try
    FSocket := Impresora.CreateClientSocket(Guid, true);
    if (Assigned(Impresora)) And (Assigned(FSocket)) then
    Begin
      (*
      1.- Conectas el socket
      2.- Asignas valor a la variable
      3.- Cierras el socket
      *)
      FSocket.Connect; // Sólo para comprobación
      TThread.Synchronize(TThread.CurrentThread,
      procedure
      begin
        (*Te recomiendo efectuar los cambios de valores a una variable global
        desde otros hilos con un Synchronize*)
        ResultadoImpresora := True;
      end);
      FSocket.Close; // Sin Esto da error al imprimir ES MUY IMPORTANTE CERRAR SOCKET AUNQUE SE ABRA DE NUEVO AL USARLO
      // java.io.IOException: read failed, socket might closed or time out, read ret:-1
    End;

  except
    on E: Exception do
    begin
      TThread.Synchronize(TThread.CurrentThread,
      procedure 
      begin
         ResultadoImpresora := False; // No es necesario, pero es mas legible
      end);
      Exit;
    end;
  end;
end;
-------------------------------------------------------------------
ImpresoraLista;
if not ResultadoImpresora then  // E
begin
  // Mesaje de error en la impresora
end
else
begin
  // Aquí va el módulo de impresion gestionado por el mensaje de confirmación
end;

Última edición por dani36652 fecha: 09-10-2023 a las 21:46:37.
Responder Con Cita