Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

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

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-04-2007
jmlifi jmlifi is offline
Miembro
 
Registrado: abr 2005
Posts: 188
Poder: 20
jmlifi Va por buen camino
Post Consulta de MultiHilos ( thread )

Quiero que se repita (infinitamente) en mi aplicación un Thread con un intervalo 20 segundos. Sólo se repite la primera vez.

Codigo:
Código Delphi [-]
unit Gestor1;
interface
uses
  SysUtils, WinTypes, WinProcs, Messages, Classes, Graphics, Controls,
  Forms, Dialogs, Menus, ExtCtrls, Gauges, DB, StdCtrls,
  Buttons, ToolWin, ComCtrls, DBCtrls, Registry, AuxFun, ImgList,FileCtrl,
  FMTBcd, SqlExpr, DBClient, Windows, SqlTimSt, xmldom, Provider, Xmlxform,
  ExportDS, SME2Cell, SME2XML, XMLIntf, msxmldom, XMLDoc, ShellAPI, DBXpress,
  ActiveX, Variants;
type

   TThread6 = class (TThread)
  private
      OwnerHandle: HWND;
      procedure RecepAutoVeriOferta;
  protected
      procedure Execute; override;
  published
      constructor Create(Owner: TForm);
     // destructor Destroy; override;
  end;
  TPrincipal = class(TForm)
    MainMenu1: TMainMenu;
    Clientes1: TMenuItem;
    Clientes: TMenuItem;
    Piezas: TMenuItem;
    ..
    ..
 

procedure TPrincipal.Ejecuta;
var
   i, j, n           : integer;
   Cod, aux, Accesos : String;
   fRec : TSearchRec;
begin
   LeeDatosEntorno;
   Thread6 := TThread6.Create(self);
    ..
    ..    
end;

Constructor TThread6.Create(Owner: TForm);
begin
  inherited Create(false);
  OwnerHandle := Owner.Handle;
  Priority := tpNormal;
  FreeOnTerminate := false;
  suspended := false;
end;
 
 
destructor TThread6.Destroy;
begin
  inherited Destroy;
end;
 
procedure TThread6.Execute;
begin
repeat
  sleep(20000);
  CoInitialize(nil);
  RecepAutoVeriOferta;
  CoUninitialize;
until terminated;
end;


Quitando el procedure destroy también me repite una vez. ¿a qué se debe? me estoy volviendo loco.
saludos

Última edición por jmlifi fecha: 23-04-2007 a las 16:35:36.
Responder Con Cita
  #2  
Antiguo 23-04-2007
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 20
droguerman Va por buen camino
has intentado poner un bucle infinito dentro de execute??
while true do
begin
...
end;
__________________
self.free;
Responder Con Cita
  #3  
Antiguo 23-04-2007
jmlifi jmlifi is offline
Miembro
 
Registrado: abr 2005
Posts: 188
Poder: 20
jmlifi Va por buen camino
Cita:
Empezado por droguerman
has intentado poner un bucle infinito dentro de execute??
while true do
begin
...
end;
asi?

Código Delphi [-]
procedure TThread6.Execute;
begin
while True do begin
  sleep(20000);
  CoInitialize(nil);
  RecepAutoVeriOferta;
  CoUninitialize;
end;
end;

sigue sin repertirse. Sólo se ejecuta una vez
Responder Con Cita
  #4  
Antiguo 23-04-2007
Avatar de droguerman
droguerman droguerman is offline
Miembro
 
Registrado: abr 2005
Ubicación: tierra
Posts: 999
Poder: 20
droguerman Va por buen camino
intenta esto:
Código Delphi [-]

THebra = class(TThread)
  public
    procedure RecepAutoVeriOferta;
    procedure execute; override;
end;


procedure THebra.execute;
begin
  while true do  
  begin
     synchronize(RecepAutoVeriOferta);
     sleep(20000);
  end;
end;
dentro de recepAutoVeriOferta puedes llamar a Coinitialize o tambien en el constructor
__________________
self.free;
Responder Con Cita
  #5  
Antiguo 24-04-2007
jmlifi jmlifi is offline
Miembro
 
Registrado: abr 2005
Posts: 188
Poder: 20
jmlifi Va por buen camino
He modificado el código de la siguiente manera:
Código Delphi [-]
  
TThread6 = class (TThread)
  public
      constructor Create;
      procedure RecepAutoVeriOferta;
      procedure Execute; override;
  end;
 
Constructor TThread6.Create;
begin
  inherited Create(true);
  Priority := tpNormal;
  FreeOnTerminate := false;
end;
 
procedure TThread6.Execute;
begin
while true do begin
  sleep(22000);
  SynChronize(RecepAutoVeriOferta)
end;
end;

Sigue sin funcionar. sólo ejecuta la primera vez.
En el Event Log del Borland Developer Studio 2006 aparece lo siguiente:
Thread Exit: Thread ID: 2580. Process GestorCS.exe (3924)
Responder Con Cita
  #6  
Antiguo 24-04-2007
Avatar de seoane
[seoane] seoane is offline
Miembro Premium
 
Registrado: feb 2004
Ubicación: A Coruña, España
Posts: 3.717
Poder: 24
seoane Va por buen camino
Comprueba que dentro del bucle no se este produciendo alguna excepcion. Piensa que hay excepciones silenciosas (abort), que pueden pasar desapercibidas.

Prueba a meter el contenido del bucle dentro de un bloque try ... except
Código Delphi [-]
procedure TThread6.Execute;
begin
  CoInitialize(nil);
  repeat
    try
      sleep(20000);    
      RecepAutoVeriOferta;    
    except
        // Aqui trata el error
    end;  
  until terminated;
  CoUninitialize;
end;
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
RETO: Implementar multihilos de forma inteligente mamcx OOP 2 26-08-2006 03:08:53
Multihilos noshy Varios 1 17-05-2006 03:19:14
Thread bendito thread...se me pierde la ventana Seba.F1 API de Windows 5 02-02-2006 00:16:30
Indy Servidor Multihilos dekae Internet 0 03-09-2005 01:26:01
multihilos taurux Varios 6 09-06-2003 17:57:24


La franja horaria es GMT +2. Ahora son las 02:38:17.


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