Gracias Neftali por tu respuesta.
Ya por la premura pude corregir el problema, aunque no como yo quería realmente. Ya pude al menos hacer que la aplicación ejecute cierta cantidad de threads "casi" concurrentes (entiendo que son hilos y no procesos concurrentes). Lo que no pude hacer es poder tener acceso a cada thread y poder saber cuando una finalizo para reutilizar la misma variable (o espacio en el arreglo dinámico), estaba usando un arreglo dinámico probando con un numero fijo de 20. Les anexo el código:
La Clase Thread, creo que la visibilidad es importante
Código Delphi
[-]
THTTPThread = class(TThread)
private
Index: Integer;
Msg: string;
Inbox: string;
Email: string;
Error: Boolean;
MyHTTP: TIdHTTP;
FRichEdit: TRichEdit;
procedure DoWork;
procedure SetRichEdit(const Value: TRichEdit);
protected
procedure Execute; override;
public
property RichEdit: TRichEdit read FRichEdit write SetRichEdit;
constructor Create(Suspended: Boolean; AIndex: Integer; AInbox, AEmail: String); overload;
destructor Destroy; reintroduce;
end;
constructor THTTPThread.Create(Suspended: Boolean; AIndex: Integer; AInbox,
AEmail: String);
begin
inherited Create(Suspended);
Index := AIndex;
Inbox := AInbox;
Email := AEmail;
MyHTTP := TIdHTTP.Create(nil);
end;
destructor THTTPThread.Destroy;
begin
MyHTTP.Destroy;
inherited Destroy;
end;
procedure THTTPThread.DoWork;
var
AuxColor: TColor;
begin
if (Error) then
begin
AuxColor := clRed;
end
else
begin
AuxColor := clBlack;
end;
FRichEdit.SelAttributes.Color := AuxColor;
FRichEdit.Lines.Add(Msg);
end;
procedure THTTPThread.Execute;
var
ParamsList: TStringList;
begin
FreeOnTerminate := True;
Error := False;
ParamsList := nil;
try
ParamsList := TStringList.Create;
with MyHTTP do
begin
ParamsList.Add('qemail=' + Email);
try
try
MyHTTP.Post(Inbox,ParamsList);
except
Error := True;
end;
finally
end;
end;
finally
ParamsList.Free;
end;
if (Error) then
begin
Msg := 'Enviando E-mail para "' + Email + '" Usando Inbox "' + Inbox + '... Resultado: Error. (' + MyHTTP.ResponseText + ')';
end
else
begin
Msg := 'Enviando E-mail para "' + Email + '" Usando Inbox "' + Inbox + '... Resultado: OK. (' + MyHTTP.ResponseText + ')';
end;
Synchronize(DoWork);
Exit
end;
procedure THTTPThread.SetRichEdit(const Value: TRichEdit);
begin
FRichEdit := Value;
end;
y este es el bloque de codigo donde se usa:
Código Delphi
[-]
MaxThreads := UpDownMaxThreads.Position;
Screen.Cursor := crHourGlass;
TxtLogEmails.Clear;
PB.Min := 0;
PB.Max := LstEmail.Items.Count * UpDownMaxEmail.Position;
PB.Position := 0;
PB.Step := 1;
CThreads := 0;
CounterThread := 0;
for i := 0 to UpDownMaxEmail.Position - 1 do
begin
for j := 0 to LstEmail.Items.Count - 1 do
begin
while True do
begin
if (CThreads < MaxThreads) then
begin
Inc(CounterThread);
HTTPThread := THTTPThread.Create(True,CounterThread,LstInbox.Items[Random(LstInbox.Items.Count)],LstEmail.Items[j].ToLower);
HTTPThread.RichEdit := TxtLogEmails;
HTTPThread.Priority := tpHighest;
HTTPThread.OnTerminate := OnThreadDone;
HTTPThread.Start;
Inc(CThreads);
Break;
end;
Sleep(Random(10) + 5);
Application.ProcessMessages;
end;
PB.StepIt;
end;
end;
while True do
begin
if (CounterThread = TotalThreads) then
begin
Break;
end;
Application.ProcessMessages;
Sleep(10);
end;
Screen.Cursor := crDefault;
Es importante usar Application.ProcessMessages mientras el proceso principal duerme.
Espero que para algun otro les sirva de ayuda