Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Problema con librería DLL y TThread (https://www.clubdelphi.com/foros/showthread.php?t=81680)

frangarrob 07-12-2012 17:50:41

Problema con librería DLL y TThread
 
Tengo el siguiente problema, que no sé cómo solucionar, he probado de todo... TBackgroundWorker, TThread, JVThread... y nada de nada...

Esto es un resumen de mi librería dll

type
TNuevo = class(TObject)
sNuevo: TIdHTTP;
private
public
procedure Funcion(var1, var2, var3: string);
constructor Create;
destructor Destroy; override;
end;

constructor TNuevo.Create;
begin
inherited;
sNuevo := TIdHTTP.Create(nil);
sNuevo.HandleRedirects := True;
end;

destructor TNuevo.Destroy;
begin
sNuevo.Free;
inherited;
end;

var finalizado : Boolean;

procedure TNuevo.Funcion(var1, var2, var3: string);
begin
..........
..........
sNuevo.Get(var1);
..........
..........
finalizado := True;
end;


En un momento de la rutina principal, quiero crear un hilo nuevo que ejecute el procedimiento "Funcion". Entonces me he creado un objeto TThread, así:

Type
TBack = class(TThread)
private
protected
procedure Execute; override;
public
Constructor Create(CreateSuspended : boolean);
end;

constructor TBack.Create(CreateSuspended : boolean);
begin
inherited Create(CreateSuspended);
end;

var sBack : TBack;

procedure TBack.Execute;
begin
try
gNuevo.Funcion('texto1', 'texto2', 'texto3': string);
except
finalizando := True;
end;
end;


Entonces, en la rutina principal pongo:

gNuevo := TNuevo.Create;
sBack := TBack.Create(False);
sBack.FreeOnTerminate := False;
finalizado := False;
sBack.Resume;
while finalizado = False do begin
try
Application.ProcessMessages;
except
end;
end;
gNuevo.Destroy;
sBack.Destroy;


Pero no hay forma de que funcione de forma correcta...

Casimiro Notevi 07-12-2012 18:10:17

Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

frangarrob 07-12-2012 19:46:20

Tengo el siguiente problema, que no sé cómo solucionar, he probado de todo... TBackgroundWorker, TThread, JVThread... y nada de nada...

Esto es un resumen de mi librería dll

Código Delphi [-]
type
  TNuevo = class(TObject)
    sNuevo: TIdHTTP;
  private
  public
    procedure Funcion(var1, var2, var3: string);    
    constructor Create;
    destructor Destroy; override;
end;

constructor TNuevo.Create;
begin
  inherited;
  sNuevo := TIdHTTP.Create(nil);
  sNuevo.HandleRedirects := True;
end;

destructor TNuevo.Destroy;
begin
  sNuevo.Free;
  inherited;
end;

var finalizado : Boolean;

procedure TNuevo.Funcion(var1, var2, var3: string);
var h : string;
begin
..........
..........
h:= sNuevo.Get(var1);
..........
..........
finalizado := True;
end;


En un momento de la rutina principal, quiero crear un hilo nuevo que ejecute el procedimiento "Funcion". Entonces me he creado un objeto TThread, así:

Código Delphi [-]
Type
    TBack = class(TThread)
    private
    protected
      procedure Execute; override;
    public
      Constructor Create(CreateSuspended : boolean);
end;

constructor TBack.Create(CreateSuspended : boolean);
begin
  inherited Create(CreateSuspended);
end;

var  sBack : TBack;

procedure TBack.Execute;
begin
  try
    gNuevo.Funcion('texto1', 'texto2', 'texto3': string);
  except
    finalizando := True;
  end;
end;


Entonces, en la rutina principal pongo:

Código Delphi [-]
gNuevo := TNuevo.Create;
sBack := TBack.Create(False);
sBack.FreeOnTerminate := False;
finalizado := False;
sBack.Resume;
while finalizado = False do begin
   try
     Application.ProcessMessages;
   except
   end;
end;
gNuevo.Destroy;
sBack.Destroy;


Pero no hay forma de que funcione de forma correcta...
Sin el Thread funciona a la perfección, pero se queda congelado hasta que acaba, con el Thread, "Funcion" se raya, según le da... y me salen excepciones...

nlsgarcia 07-12-2012 20:19:00

frangarrob,

Te comento:
Cita:

1- La unidad IdHTTP no esta declarada.

2- El objeto gNuevo se usa antes de ser declarado e instanciado.

3- La llamada a gNuevo.Funcion('texto1', 'texto2', 'texto3': string) es erronea.

4- La variable finalizando no existe, existe la variable finalizado.

5- Application.ProcessMessages no tiene ninguna unidad que la declare.

6- ¿Que Exporta este DLL?.
Revisa este código:
Código Delphi [-]
library ProjectDLL;

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, IdHTTP;

{$R *.res}

type
TNuevo = class(TObject)
   sNuevo: TIdHTTP;
   private
   public
      procedure Funcion(var1, var2, var3: string);
      constructor Create;
      destructor Destroy; override;
end;

TBack = class(TThread)
   private
   protected
      procedure Execute; override;
   public
      constructor Create(CreateSuspended : boolean);
end;

var
  finalizado : Boolean;
  sBack : TBack;

constructor TNuevo.Create;
begin
   inherited;
   sNuevo := TIdHTTP.Create(nil);
   sNuevo.HandleRedirects := True;
end;

destructor TNuevo.Destroy;
begin
   sNuevo.Free;
   inherited;
end;

procedure TNuevo.Funcion(var1, var2, var3: string);
begin
   sNuevo.Get(var1);
   finalizado := True;
end;

constructor TBack.Create(CreateSuspended : boolean);
begin
   inherited Create(CreateSuspended);
end;

procedure TBack.Execute;
var
   gNuevo : TNuevo;
begin
   gNuevo := TNuevo.Create;
   try
      gNuevo.Funcion('texto1', 'texto2', 'texto3');
   except
      finalizado := True;
   end;
   gNuevo.Destroy;
end;

begin
   sBack := TBack.Create(False);
   sBack.FreeOnTerminate := False;
   finalizado := False;
   sBack.Resume;
   while finalizado = False do begin
      try
         Application.ProcessMessages;
      except
      end;
   end;
   sBack.Destroy;
end.
El código anterior resuelve todo lo comentado (Puntos 1 al 5), pero desconozco si es lo que requiere tu proyecto.

Espero sea útil :)

Nelson.


La franja horaria es GMT +2. Ahora son las 00:29:39.

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