You need to handle exceptions, although this can be done in many
different ways the following (scribbled in OE) may show one possible
way:
procedure TThreadedMail.Execute;
var
msg:TMsg;
IsMessage : Boolean;
begin
try
mainform.SmtpCli.ThreadAttach;
try
mainform.SmtpCli.CtrlSocket.MultiThreaded := true;
try
mainform.SmtpCli.Connect;
while True do
begin
IsMessage := GetMessage(Msg, 0, 0, 0);
{ Just in case someone calls WM_QUIT ?}
if (not IsMessage) or (msg.message = wm_mailcancel) then
raise Exception.Create('Mail aborted');
{ wm_mailCompleted - Posted from SessionClose or RequestDone }
if (msg.message = wm_mailCompleted) then
Break;
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
except
handle error;
Better unassign event handlers;
mainform.SmtpCli.Abort;
end;
finally
mainform.SmtpCli.ThreadDetach;
end
finally
{ Has to be called in any case if you free the thread on your own }
PostThreadMessage(mainthread, wm_mailende, 0, 0);
end;
end;
--
Arno Garrels [TeamICS]
http://www.overbyte.be/eng/overbyte/teamics.html
Markus Humm wrote:
> Hello,
>
> I've tested one of my ideas for making SmtpCli working for me now.
> I've constructed a thread which will do the sending of the mail and
> thus does a thread attach/detach and has its own message loop.
>
> It also knows the threadid of the main program so it posts a message
> to it when the thread's execute is done either by successfully
> sending the mail or because some error occured. (okay, I should add
> the errorcode to the message, just got this idea but okay...).
>
> The thread also has a Cancel method which sends a special message to
> the thread which also makes it leave his message loop and does a
> abort on the control socket of the smtpcli and on the smtpcli.
>
> The one sending the e-mail fires a timer which when occurring will
> call this cancel method. If the mail sending was faster than the
> timer the timer is freed. I've tested this with a working e-mail
> server and a wrong host name. Is seemed to work, but I'd like to have
> some expert's opinion if this is good (or at least okay) practice or
> not, before I'm running into severe trouble. I'll slightly enhance it
> and test it tomorrow at work.
>
> This is the execute (where mainform is the VCL mainform of the test
> app.):
>
> procedure TThreadedMail.Execute;
> var msg:TMsg;
> begin
> mainform.SmtpCli.ThreadAttach;
> mainform.SmtpCli.CtrlSocket.MultiThreaded:=true;
> mainform.SmtpCli.Connect;
>
> msg.message:=0;
>
> while GetMessage(Msg, 0, 0, 0) do
> begin
> if (msg.message = wm_mailcancel) then break;
>
> TranslateMessage(Msg);
> DispatchMessage(Msg);
> end;
>
> if (Msg.message = wm_mailcancel) then
> begin
> try
> mainform.SmtpCli.CtrlSocket.Abort;
> mainform.SmtpCli.Abort;
> except
> end;
> end;
>
> mainform.SmtpCli.ThreadDetach;
> PostThreadMessage(mainthread, wm_mailende, 0, 0);
> end;
>
> Greetings
>
> Markus
--
To unsubscribe or change your settings for TWSocket mailing list
please goto http://www.elists.org/mailman/listinfo/twsocket
Visit our website at http://www.overbyte.be