Hola rmendoza83
El problema que veo en tu código es que que por cada email que envías creas y destruye el hilo,
te pongo aquí un ejemplo de como puedes realizar una lectura sincronizada con las listas, espero te pueda servir
Código Delphi
[-]
type
TGetMailFunction=function:string of object;
THTTPThread = class(TThread)
private
FEmail:String;
FOnGetNewEmail:TGetMailFunction;
procedure SetOnNewEmail(const Value: TGetMailFunction);
procedure GetNewEmail;
procedure enviarEmail(const AEmail:string);
public
procedure execute; override;
property OnNewEmail:TGetMailFunction write SetOnNewEmail;
end;
TForm1 = class(TForm)
Button1: TButton;
ListBox1: TListBox;
ListBox2: TListBox;
procedure Button1Click(Sender: TObject);
private
public
function GetNewEmail:String;
procedure OnThreadDone(sender:TObject);
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
MaxThreads:Integer=20;
var
CounterThread: integer;
procedure TForm1.Button1Click(Sender: TObject);
var
i, j:longint;
HTTPThread:THTTPThread;
begin
Screen.Cursor := crHourGlass;
CounterThread := 0;
for i := 1 to MaxThreads do begin
Inc(CounterThread);
HTTPThread := THTTPThread.Create(True);
HTTPThread.Priority := tpHighest;
HTTPThread.OnNewEmail := GetNewEmail;
HTTPThread.OnTerminate := OnThreadDone;
HTTPThread.FreeOnTerminate:=true;
HTTPThread.Start;
end;
while (CounterThread>0) do begin
Application.ProcessMessages;
Sleep(300);
end;
Screen.Cursor := crDefault;
end;
function TForm1.GetNewEmail: String;
begin
if (Listbox1.count > 0) then begin
Result := listBox1.items[0];
listBox1.Items.Delete(0);
end
else
result := '';
end;
procedure TForm1.OnThreadDone(sender: TObject);
begin
if sender is THTTPThread then
dec(CounterThread);
end;
procedure THTTPThread.enviarEmail(const AEmail: string);
begin
end;
procedure THTTPThread.execute;
begin
inherited;
if not assigned(FOnGetNewEmail) then exit;
Synchronize(GetNewEmail);
while not terminated and (FEmail <> '') do begin
enviarEmail(FEmail);
Synchronize(GetNewEmail);
end;
end;
procedure THTTPThread.GetNewEmail;
begin
FEmail:=FOnGetNewEmail;
end;
procedure THTTPThread.SetOnNewEmail(const Value: TGetMailFunction);
begin
FOnGetNewEmail:=value;
end;
como peculiaridad del ejemplo le paso al hilo un puntero a una función que es la encargada de leer el email de la lista y que hay que llamar siempre con el synchronize.
Espero te pueda servir
Un saludo