Cuestión : Enviar los email en proceso de fondo (y continuar trabajando)

Hola, el

As que personilize los email por cliente, yo necesita enviarlos el email 1000 de one-by-one.
When es envía esta manera, el usuario final de mi app tendrá que esperar hasta que el todo haya acabado. ¿Si los accesorios se agregan le incluso toman mucho longer.

What que estoy buscando soy una manera de enviar el email en un envío opcional de backgroudprocess.
During de los email, el usuario final puede decidir esperarlo todo para suceder, o enviarlo al fondo y continuar el otro trabajo con el app.

Can cualquiera suministrarme un cierto codesample en cómo lograr esto?
class= > " claro " del
> del " codeSnippet " del class= del
class= " lineNumbers " del
class= del
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
>procedure notpretty SendEmails " del class= " del id= " codeSnippet948361 del
           
class= del

Respuesta : Enviar los email en proceso de fondo (y continuar trabajando)

crea un nuevo hilo de rosca para enviar email.

>> ¿Puede el usuario a partir de ese momento encendido hacer cualquier cosa dentro del uso?

sure. pero hay dos cosas que usted tiene que controlar:

1. el usuario quiere parar de su uso pero los email todavía están enviando. En este caso usted puede terminar el hilo de rosca o esperar su acabamiento

2. no cambiar query1, edit1, edit2 porque el hilo de rosca lo utiliza

>> Qué si ocurre un error. ¿El usuario todavía podrá conseguir esto?

Sí, su intento/excepto/showmessage todavía trabaja:

        intento
          IdSMTP.Connect;
          IdSMTP.Send (IdMsg);
        excepto
          Showmessage (“error al enviar el email ");
        extremo;

Sería mejor envolver todo ejecuta método en intento/excepto también como esto:

procedimiento TEmailThread.Execute;
var IdSMTP: TIdSMTP;
     IdMsg: TIdMessage;
     I: Número entero;
comenzar
  intento
    IdSMTP: =TIdSMTP.Create (nada);
    IdSMTP.Host: = ' my.domain.nl'; // substituyen por su servidor saliente
    IdSMTP.Port: =25;
    IdSMTP.Username: = “MyUserName”;
    IdSMTP.Password: = “MyPassword”;
    intento
      si no IdSMTP.Connected entonces
        IdSMTP.Connect;

      Para I: = 0 a Query1.Recordcount -1 hace
      comenzar
        si entonces está terminado salir;
 
        intento
          IdMsg: =TIdMessage.Create (nada);
          IdMsg.From.Address: = edit1.Text;
          IdMsg.Subject: = edit2.text;
          IdMsg.Recipients.EMailAddresses: = Query1.FieldByName (“email ").Text;
 
          Comienzo de // una cierta función para personalizar el cuerpo por cliente
          IdMsg.Body.Text: = PersonalizeEmailForCustomer;
         intento
            IdSMTP.Connect;
            IdSMTP.Send (IdMsg);
          excepto
             en E: La excepción hace
               Showmessage (“error al enviar el email: ” + E.Message);
          extremo;
        finalmente
          IdMsg.Free;
        extremo;
        Query1.Next;
      extremo;
    finalmente
      si IdSMTP.Connected entonces
        IdSMTP.Disconnect;
      IdSMTP.Free;
    extremo;
  excepto
    en E: La excepción hace
      Showmessage (“error al enviar el email: ” + E.Message);
  extremo;
extremo;

>> ¿Todavía es posible informar al usuario final que el envío ha acabado, demuestra un cierto resultado?

Usted puede utilizar el mensaje de OnTerminate o

 con TEmailThread.Create (verdad) hacer
 comenzar
   OnTerminate: = ThreadOnTerminate;
   FreeOnTerminate: = verdad;
   Curriculum vitae;
 extremo;

procedimiento TMainForm.ThreadOnTerminate (ASender: TObject);
comenzar
  ShowMessage (se hace el “trabajo ");
extremo;

>> Por lo tanto necesito pasar ese contenido al hilo de rosca de alguna manera

usted puede pasar al hilo de rosca cualquier parámetro que usted tenga gusto vía su constructor. Por ejemplo:

  TEmailThread = clase (TThread)
  privado
    FSubject: secuencia;
  protegido
    el procedimiento ejecuta; invalidación;
  público
    el constructor crea (const ASubject: secuencia);
  extremo;

constructor TEmailThread.Create (const ASubject: secuencia);
comenzar
  heredado crear (verdad);
  FSubject: = ASubject;
extremo;

procedimiento TEmailThread.Execute;

        // usar el var local
        IdMsg.Subject: = FSubject; // era IdMsg.Subject: = edit2.text;
Otras soluciones  
 
programming4us programming4us