Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Varios
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 07-12-2012
frangarrob frangarrob is offline
Miembro
NULL
 
Registrado: ago 2012
Posts: 13
Poder: 0
frangarrob Va por buen camino
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...
Responder Con Cita
  #2  
Antiguo 07-12-2012
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.040
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
Recuerda poner los tags al código fuente, ejemplo:



Gracias
Responder Con Cita
  #3  
Antiguo 07-12-2012
frangarrob frangarrob is offline
Miembro
NULL
 
Registrado: ago 2012
Posts: 13
Poder: 0
frangarrob Va por buen camino
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...
Responder Con Cita
  #4  
Antiguo 07-12-2012
Avatar de nlsgarcia
[nlsgarcia] nlsgarcia is offline
Miembro Premium
 
Registrado: feb 2007
Ubicación: Caracas, Venezuela
Posts: 2.206
Poder: 21
nlsgarcia Tiene un aura espectacularnlsgarcia Tiene un aura espectacular
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.

Última edición por nlsgarcia fecha: 07-12-2012 a las 20:28:34.
Responder Con Cita
Respuesta



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
Problema creando una libreria. Suriu OOP 4 03-11-2010 22:49:47
Problema con libreria MSVCRT.dll El_Perrito Firebird e Interbase 2 19-08-2006 19:55:36
problema con libreria reevil OOP 4 17-05-2006 13:30:06
Tengo un problema con la libreria ElDioni Varios 0 15-07-2005 13:27:04
Problema con librería en Visual C++ llauraff Varios 0 16-09-2004 14:36:20


La franja horaria es GMT +2. Ahora son las 12:09:13.


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