Ver Mensaje Individual
  #1  
Antiguo 08-10-2023
jhonalone jhonalone is offline
Miembro
 
Registrado: sep 2007
Ubicación: Madrid
Posts: 547
Reputación: 17
jhonalone Va por buen camino
¿Se pueden modificar Global Vars en un TThread?

Hola, de nuevo, amigos del foro.
Nunca había usado hilos en mis aplicaciones. Quizá no fuera necesario.
Después de este problema y gracias a dani36652 que me ayudó a resolverlo con un hilo, he visto la utilidad de los mismos.
Como digo en el enunciado, me veo en la necesidad de modificar alguna variable que no está declarada en el hilo.
Tengo el problema de que no se actualiza al terminar el hilo.
Al insistir una o dos veces más termina tomando su correcto valor. Pero esto no es operativo.
Se trata de comprobar si una impresora conectada por BlueTooth está operativa o no.
Os participo el código que estoy utilizando, por si alguien puede ayudarme.
(Conste que antes de solicictar vuestra ayuda llevo 2 dias buscando en internet sin éxito)

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
    { Public declarations }
end;

var
  Presu: TPresu;

implementation
----------------------------------------------------------------------
procedure TPresu.ImpresoraLista;
var
 Thread: TThread;
begin

 Thread:= TThread.CreateAnonymousThread(
    procedure
    begin
     TThread.ForceQueue(TThread.CurrentThread,
     ImpresoraConectada) // Activamos el procedimiento lento en el Thread
    end);

   Thread.FreeOnTerminate:= True;
   Thread.Start;

end;

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

  ListaVinculados: TBluetoothDeviceList;
  LServices: TBluetoothServiceList;

begin
ResultadoImpresora := False; // ES LA VARIABLE GLOBAL DE LA TFORM
                             // QUE NO SE MODIFICA DESPUES DE TERMINAR
                             // EL TTHREAD
                             // SI REPITES EL TTHREAD TERMINA CAMMBIANDO

  try
    FBluetoothManager := TBluetoothManager.Current;
    if FBluetoothManager = nil
    then begin
         Mensaje(Form1.NoCodi(ST.Strings[79]), 0);
         Exit;
         end;

    FBluetoothManager.SocketTimeout := 100;

    BluetoothAdapter := FBluetoothManager.CurrentAdapter;
    if BluetoothAdapter = nil
    then begin
         Mensaje(Form1.NoCodi(ST.Strings[80]), 0);
         Exit;
         end;

    ListaVinculados := FBluetoothManager.GetPairedDevices(BluetoothAdapter);
    if ListaVinculados = nil
    then begin
         Mensaje(Form1.NoCodi(ST.Strings[81]), 0);
         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
           Mensaje(Form1.NoCodi(ST.Strings[82]), 0);
           Exit;
           end;

  except
   on E: Exception do
   begin
     Msg := E.Message;
     Mensaje('Error al Conectar el Software de la Impresora: ' + Msg, 0);
     Exit;
   end;
 end;

    try
    FSocket := Impresora.CreateClientSocket(Guid, true);

    if (Assigned(Impresora)) And (Assigned(FSocket))
    then Begin
         FSocket.Connect; // Sólo para comprobación
         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
         ResultadoImpresora := True;
         End;

    except
      on E: Exception do
      begin
          ResultadoImpresora := False; // No es necesario, pero es mas legible
          Exit;
      end;
    end;

end;
-------------------------------------------------------------------
ImpresoraLista;

                if not ResultadoImpresora  // E
                then 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;

Esperando que, si el problema tiene solución y alguien lo sabe, la comparta conmigo.
Gracias de antemano.
Saludos cordiales.
__________________
"Pedid y se os dará; buscad y hallaréis ..." (Lc 11,9-10)
"...si no tengo caridad, nada soy..." (1 Cor 13,1-13)

Última edición por jhonalone fecha: 08-10-2023 a las 16:31:11.
Responder Con Cita