Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Desarrollo en Delphi para Android
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy


 
 
Herramientas Buscar en Tema Desplegado
  #5  
Antiguo 09-10-2023
dani36652 dani36652 is offline
Miembro
 
Registrado: abr 2019
Posts: 57
Poder: 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 20:46:37.
Responder Con Cita
 



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
Salir de TThread joseprad Varios 4 03-01-2015 16:43:36
FTP y TThread keys Internet 4 01-06-2011 08:12:43
TThread y componentes de red noob OOP 0 18-04-2009 01:25:07
File_get_contents & POST Vars Delar PHP 2 17-10-2007 17:15:31
Lio con TThread diegofhernando Varios 0 20-01-2004 17:58:35


La franja horaria es GMT +2. Ahora son las 22:32:47.


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