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;
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
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
[-]
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 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.