Ver Mensaje Individual
  #1  
Antiguo 11-04-2017
rmendoza83 rmendoza83 is offline
Miembro
 
Registrado: ago 2006
Posts: 50
Reputación: 18
rmendoza83 Va por buen camino
Programacion con Threads

Buenos Dias mis estimados, espero que puedan colaborarme a detectar cual es el problema que estoy presentando, les comento, estoy haciendo un programa para envio de correos masivos usando Indy para conexiones HTTP->post a unos servidores con apache para que hagan el envio de los respectivos correos. Por esta parte estoy muy bien, el problema que presento es que requiero hacer simultaneamente el envio de los correos con 20 procesos (hilos) y que se mantenga constante 20 procesos enviando las peticiones de Indy, basicamente esto lo estoy logrando, el problema radica en que necesito mostrar el log de operaciones de cada peticion en un control memo del formulario principal y por alguna razon los hilos no terminan su ejecucion, entiendo que debo usar Syncronize para evitar conflicto de acceso entre los hilos pero no se si lo estoy utilizando correctamente y necesita ayuda es con esto, les anexo el codigo en cuestion:

Esta es la clase Thread
Código Delphi [-]
THTTPThread = class(TThread)
    private
      Index: Integer;
      Msg: string;
      Error: Boolean;
      MyHTTP: TIdHTTP;
    public
      constructor Create(Suspended: Boolean; AIndex: Integer); overload;
      destructor Destroy; reintroduce;
      procedure Execute; override;
      procedure DoWork;
  end;

{ THTTPThread }

constructor THTTPThread.Create(Suspended: Boolean; AIndex: Integer);
begin
  inherited Create(Suspended);
  Index := AIndex;
  MyHTTP := TIdHTTP.Create(nil);
end;

destructor THTTPThread.Destroy;
begin
  MyHTTP.Destroy;
  inherited Destroy;
end;

procedure THTTPThread.DoWork;
var
  AuxColor: TColor;
begin
  with FrmP do
  begin
    if (Error) then
    begin
      AuxColor := clRed;
    end
    else
    begin
      AuxColor := clBlack;
    end;
    LogSpammer(Msg,AuxColor);
  end;
end;

procedure THTTPThread.Execute;
var
  ParamsList: TStringList;
  Inbox, Email: string;
begin
  FreeOnTerminate := False;
  Randomize;
  Error := False;
  ParamsList := nil;
  try
    //Getting Random Inbox and Email
    Inbox := FrmP.LstInbox.Items[Random(FrmP.LstInbox.Count)];
    Email := FrmP.LstEmail.Items[Index].ToLower;
    ParamsList := TStringList.Create;
    with MyHTTP do
    begin
      ParamsList.Add('qemail=' + Email);
      try
        MyHTTP.Post(Inbox,ParamsList);
      except
        Error := True;
      end;
    end;
  finally
    ParamsList.Free;
  end;
  if (Error) then
  begin
    Msg := 'Enviando E-mail para "' + Email + '"... Resultado: Error. (' + MyHTTP.ResponseText + ')';
  end
  else
  begin
    Msg := 'Enviando E-mail para "' + Email + '"... Resultado: OK. (' + MyHTTP.ResponseText + ')';
  end;
  Synchronize(DoWork);
end;

Aqui la porcion de codigo donde genero los hilos:
FrmP es el Formulario Principal y LstInbox y LstEmail son ListBox con la lista de correos electronicos.
Código Delphi [-]
            //Configuring Thread
            while True do
            begin
              if (Length(AThreads) < MaxThreads) then
              begin
                SetLength(AThreads,Length(AThreads) + 1);
                AThreads[Length(AThreads) - 1] := THTTPThread.Create(True,j);
                AThreads[Length(AThreads) - 1].Start;
                Break;
              end
              else
              begin
                for k := Low(AThreads) to High(AThreads) do
                begin
                  if (AThreads[k].Terminated) then //Aqui visualizo el depurador pero la tarea nunca termina.
                  begin
                    AThreads[k].Free;
                    AThreads[k] := THTTPThread.Create(True,j);
                    AThreads[k].Start;
                    Break;
                  end;
                end;
              end;
              Sleep(100);
            end;

AThreads es un Array de THTTPThread dinamico y basicamente controla la cantidad de thread a generar, y MaxThreads la cantidad maxima permitida a generar.

Espero que puedan ayudarme, al menos comprender porque la aplicacion se cuelga y los hilos nunca terminan que basicamente es el problema que presento.

Saludos.
Responder Con Cita