Frage : EMail im Hintergrundprozess senden (und fortfahren zu arbeiten)

Hallo, muss

As, das ich die eMail pro Kunden, ich personilize, sie senden, one-by-one.
When sind eMail 1000 senden auf diese Weise, der Endbenutzer meiner APP muss warten, bis die alle beendet. Wenn Zubehören es nehmen sogar viel longer.

What addiert, das ich bin eine Weise, die eMail in einem wahlweise freigestellten backgroudprocess.
During Senden der eMail zu senden suche, kann der Endbenutzer entscheiden, zu warten, dass aller es geschieht, oder, es zum Hintergrund zu schicken und andere Arbeit mit dem app.

Can jedes fortzusetzen mich mit etwas codesample auf, wie man zur Verfügung stellen dieses vollendet?
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:
6:
37:
38:
39:
40:
41:
procedure SendEmails;
var IdSMTP: TIdSMTP;
     IdMsg: TIdMessage;
     I: Ganze Zahl;
anfangen
  IdSMTP: =TIdSMTP.Create (Null);
  IdSMTP.Host: = ' my.domain.nl'; // ersetzen durch Ihren abgehenden Bediener
  IdSMTP.Port: =25;
  IdSMTP.Username: = „MyUserName“;
  IdSMTP.Password: = „MyPassword“;
  Versuch
    wenn NICHT IdSMTP.Connected dann
      IdSMTP.Connect;

    Für I: = tun 0 zu Query1.Recordcount -1
    anfangen
      Versuch
        IdMsg: =TIdMessage.Create (Null);
        IdMsg.From.Address: = edit1.Text;
        IdMsg.Subject: = edit2.text;
        IdMsg.Recipients.EMailAddresses: = Query1.FieldByName („eMail ").Text;

        //-Anfang irgendeine Funktion, zum des Körpers pro Kunden zu personifizieren
        IdMsg.Body.Text: = PersonalizeEmailForCustomer;
        Versuch
          IdSMTP.Connect;
          IdSMTP.Send (IdMsg);
        ausgenommen
          Showmessage („Störung, wenn eMail gesendet ");
        Ende;
      schließlich
        IdMsg.Free;
      Ende;
      Query1.Next;
    Ende;
  schließlich
    wenn IdSMTP.Connected dann
      IdSMTP.Disconnect;
    IdSMTP.Free;
  Ende;
Ende;

Antwort : EMail im Hintergrundprozess senden (und fortfahren zu arbeiten)

es stellt ein neues Gewinde für das Senden von eMail her.

>> Kann der Benutzer von diesem Moment alles innerhalb der Anwendung an tun?

sure. aber es gibt zwei Sachen, die Sie steuern müssen:

1. Benutzer möchten von Ihrer Anwendung beendigen, aber die eMail senden noch. In diesem Fall können Sie das Gewinde beenden oder sein Vollenden warten

2. query1, edit1, edit2 nicht ändern, weil das Gewinde sie verwendet

>> Was, wenn eine Störung auftritt. Ist der Benutzer noch in der Lage, dieses zu erhalten?

Ja arbeiten Ihr Versuch/ausgenommen/showmessage noch:

        Versuch
          IdSMTP.Connect;
          IdSMTP.Send (IdMsg);
        ausgenommen
          Showmessage („Störung, wenn eMail gesendet wird ");
        Ende;

Es würde besser sein, alle einzuwickeln durchführt Methode in Versuch/ausgenommen auch so:

Verfahren TEmailThread.Execute;
var IdSMTP: TIdSMTP;
     IdMsg: TIdMessage;
     I: Ganze Zahl;
anfangen
  Versuch
    IdSMTP: =TIdSMTP.Create (Null);
    IdSMTP.Host: = ' my.domain.nl'; // ersetzen durch Ihren abgehenden Bediener
    IdSMTP.Port: =25;
    IdSMTP.Username: = „MyUserName“;
    IdSMTP.Password: = „MyPassword“;
    Versuch
      wenn NICHT IdSMTP.Connected dann
        IdSMTP.Connect;

      Für I: = tun 0 zu Query1.Recordcount -1
      anfangen
        wenn Sie dann beendet werden, herausnehmen;
 
        Versuch
          IdMsg: =TIdMessage.Create (Null);
          IdMsg.From.Address: = edit1.Text;
          IdMsg.Subject: = edit2.text;
          IdMsg.Recipients.EMailAddresses: = Query1.FieldByName („eMail ").Text;
 
          //-Anfang irgendeine Funktion, zum des Körpers pro Kunden zu personifizieren
          IdMsg.Body.Text: = PersonalizeEmailForCustomer;
         Versuch
            IdSMTP.Connect;
            IdSMTP.Send (IdMsg);
          ausgenommen
             auf E: Ausnahme tun
               Showmessage („Störung, wenn eMail gesendet wird: “ + E.Message);
          Ende;
        schließlich
          IdMsg.Free;
        Ende;
        Query1.Next;
      Ende;
    schließlich
      wenn IdSMTP.Connected dann
        IdSMTP.Disconnect;
      IdSMTP.Free;
    Ende;
  ausgenommen
    auf E: Ausnahme tun
      Showmessage („Störung, wenn eMail gesendet wird: “ + E.Message);
  Ende;
Ende;

>> Ist es noch möglich, den Endbenutzer, dass das Senden zu informieren beendet hat, zeigt irgendein Resultat?

Sie können OnTerminate Mitteilung benutzen oder

 mit TEmailThread.Create (zutreffend) tun
 anfangen
   OnTerminate: = ThreadOnTerminate;
   FreeOnTerminate: = ausrichten;
   Zusammenfassung;
 Ende;

Verfahren TMainForm.ThreadOnTerminate (ASender: TObject);
anfangen
  ShowMessage („Arbeit wird erledigt ");
Ende;

>> Folglich muss ich diesen Inhalt zum Gewinde irgendwie führen

Sie können zum Gewinde alle mögliche Parameter führen, die Sie über seinen Erbauer mögen. Z.B.:

  TEmailThread = Kategorie (TThread)
  privat
    FSubject: Schnur;
  geschützt
    Verfahren führen durch; Übersteuerung;
  Öffentlichkeit
    Erbauer verursachen (const ASubject: Schnur);
  Ende;

Erbauer TEmailThread.Create (const ASubject: Schnur);
anfangen
  übernommen verursachen (ausrichten);
  FSubject: = ASubject;
Ende;

Verfahren TEmailThread.Execute;

        // using lokalen var
        IdMsg.Subject: = FSubject; // war IdMsg.Subject: = edit2.text;
Weitere Lösungen  
 
programming4us programming4us