Questione : Trasmettere i email nel processo di priorità bassa (e continuare a funzionare)

Ciao, il

As che personilize i email per cliente, io deve trasmetterlo il email 1000 di one-by-one.
When è trasmette questo senso, l'utilizzatore finale del mio app dovrà attendere fino a che i tutti non abbiano rifinito. Se i collegamenti si aggiungono persino prenderanno molto longer.

What che sto cercando sono un senso trasmettere il email in un invio facoltativo di backgroudprocess.
During dei email, l'utilizzatore finale può decidere di aspettarlo tutto per accadere, o trasmetterlo ai precedenti e continuare l'altro lavoro con il app.

Can qualcuno fornirmi un certo codesample su come compire questo?
class= > " libero " 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

Risposta : Trasmettere i email nel processo di priorità bassa (e continuare a funzionare)

genera un nuovo filetto per l'invio dei email.

>> Può l'utente da quel momento in poi fare qualche cosa all'interno dell'applicazione?

sure. ma ci sono due cose che dovete controllare:

1. l'utente vuole rinunciare dalla vostra applicazione ma i email ancora stanno trasmettendo. In questo caso potete terminare il filetto o aspettare la relativa rifinitura

2. non cambiare query1, edit1, edit2 perché il filetto li usa

>> Che cosa se un errore accade. L'utente ancora potrà ottenere questo?

Sì, la vostra prova/tranne/showmessage ancora funziona:

        prova
          IdSMTP.Connect;
          IdSMTP.Send (IdMsg);
        tranne
          Showmessage (“errore quando trasmettono email ");
        estremità;

Sarebbe migliore spostare tutto esegue il metodo nella prova/tranne ugualmente come questo:

procedura TEmailThread.Execute;
varietà IdSMTP: TIdSMTP;
     IdMsg: TIdMessage;
     I: Numero intero;
cominciare
  prova
    IdSMTP: =TIdSMTP.Create (zero);
    IdSMTP.Host: = ' my.domain.nl'; // sostituiscono dal vostro assistente uscente
    IdSMTP.Port: =25;
    IdSMTP.Username: = “MyUserName„;
    IdSMTP.Password: = “MyPassword„;
    prova
      se non IdSMTP.Connected allora
        IdSMTP.Connect;

      Per la I: = 0 a Query1.Recordcount -1 fa
      cominciare
        se allora terminato uscire;
 
        prova
          IdMsg: =TIdMessage.Create (zero);
          IdMsg.From.Address: = edit1.Text;
          IdMsg.Subject: = edit2.text;
          IdMsg.Recipients.EMailAddresses: = Query1.FieldByName (“email ").Text;
 
          Inizio di // una certa funzione per rendere personale corpo per cliente
          IdMsg.Body.Text: = PersonalizeEmailForCustomer;
         prova
            IdSMTP.Connect;
            IdSMTP.Send (IdMsg);
          tranne
             sulla E: L'eccezione fa
               Showmessage (“errore quando trasmettono email: „ + E.Message);
          estremità;
        infine
          IdMsg.Free;
        estremità;
        Query1.Next;
      estremità;
    infine
      se IdSMTP.Connected allora
        IdSMTP.Disconnect;
      IdSMTP.Free;
    estremità;
  tranne
    sulla E: L'eccezione fa
      Showmessage (“errore quando trasmettono email: „ + E.Message);
  estremità;
estremità;

>> È ancora possibile informare l'utilizzatore finale che trasmettere ha rifinito, mostra un certo risultato?

Potete usare il messaggio di OnTerminate o

 con TEmailThread.Create (allineare) fare
 cominciare
   OnTerminate: = ThreadOnTerminate;
   FreeOnTerminate: = allineare;
   Riassunto;
 estremità;

procedura TMainForm.ThreadOnTerminate (ASender: TObject);
cominciare
  ShowMessage (“il lavoro è fatto ");
estremità;

>> Di conseguenza devo passare in qualche modo quel soddisfare al filetto

potete passare al filetto tutti i parametri che gradite via il relativo costruttore. Per esempio:

  TEmailThread = codice categoria (TThread)
  riservato
    FSubject: stringa;
  protettivo
    la procedura esegue; provvigione supplementare;
  pubblico
    il costruttore genera (const ASubject: stringa);
  estremità;

costruttore TEmailThread.Create (const ASubject: stringa);
cominciare
  ereditato generare (allineare);
  FSubject: = ASubject;
estremità;

procedura TEmailThread.Execute;

        // using la varietà locale
        IdMsg.Subject: = FSubject; // era IdMsg.Subject: = edit2.text;
Altre soluzioni  
 
programming4us programming4us