Вопрос : Пошлите электронная почта в процессе предпосылки (и продолжайтесь работать)

Hi,

As, котор я personilize электронная почта в клиент, я нужно послать их электронная почта 1000 one-by-one.
When посылает эту дорогу, пользователь моего app ждать до тех пор пока все не закончить. Если приложения добавлены ему даже примут много longer.

What, котор я ищу буду дорогой послать электронная почта в опционной посылке backgroudprocess.
During электронная почта, пользователь может решить ждать ее все для того чтобы случиться, или послать ее к предпосылке и продолжить другую работу с app.

Can кто-нибудь поставьте меня с некоторым codesample на как выполнить это?
class= " ясное " >
> " codeSnippet " class=
class= " lineNumbers "
class=
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 SendEmails " class= " id= " codeSnippet948361
           
class=

Ответ : Пошлите электронная почта в процессе предпосылки (и продолжайтесь работать)

оно создает новую резьбу для посылки электронная почта.

>> Может потребитель от того момента дальше сделать что-нибыдь в пределах применения?

конечно. но 2 вещи вы должны контролировать:

1. потребитель хочет прекратить от вашего применения но электронная почта все еще посылают. В этот случай вы можете прекратить резьбу или ждать свою отделку

2. не измените query1, edit1, edit2 потому что резьба использует их

>> Если ошибка происходит. Потребитель все еще будет получить это?

Да, ваша попытка/за исключением/showmessage все еще работают:

        попытка
          IdSMTP.Connect;
          IdSMTP.Send (IdMsg);
        за исключением
          Showmessage («ошибка при посылке электронная почта ");
        конец;

Было бы более лучше обернуть все исполняет метод в попытку/за исключением слишком как это:

процедура TEmailThread.Execute;
var IdSMTP: TIdSMTP;
     IdMsg: TIdMessage;
     Iий: Интежер;
начните
  попытка
    IdSMTP: =TIdSMTP.Create (ноли);
    IdSMTP.Host: = ' my.domain.nl'; // заменяют ть вашим общительным сервером
    IdSMTP.Port: =25;
    IdSMTP.Username: = «MyUserName»;
    IdSMTP.Password: = «MyPassword»;
    попытка
      если НЕ IdSMTP.Connected после этого
        IdSMTP.Connect;

      Для I: = 0 к Query1.Recordcount -1 делает
      начните
        если прекращено после этого выходите;
 
        попытка
          IdMsg: =TIdMessage.Create (ноли);
          IdMsg.From.Address: = edit1.Text;
          IdMsg.Subject: = edit2.text;
          IdMsg.Recipients.EMailAddresses: = Query1.FieldByName («электронная почта ").Text;
 
          Старт // некоторая функция для того чтобы персонализировать тело в клиент
          IdMsg.Body.Text: = PersonalizeEmailForCustomer;
         попытка
            IdSMTP.Connect;
            IdSMTP.Send (IdMsg);
          за исключением
             на e: Исключение делает
               Showmessage («ошибка при посылке электронная почта: » + E.Message);
          конец;
        окончательно
          IdMsg.Free;
        конец;
        Query1.Next;
      конец;
    окончательно
      если IdSMTP.Connected после этого
        IdSMTP.Disconnect;
      IdSMTP.Free;
    конец;
  за исключением
    на e: Исключение делает
      Showmessage («ошибка при посылке электронная почта: » + E.Message);
  конец;
конец;

>> Все еще по возможности сообщить пользователь что посылка заканчивала, показывает некоторый результат?

Вы можете использовать сообщение OnTerminate или

 с TEmailThread.Create (поистине) сделайте
 начните
   OnTerminate: = ThreadOnTerminate;
   FreeOnTerminate: = True;
   Резюме;
 конец;

процедура TMainForm.ThreadOnTerminate (ASender: TObject);
начните
  ShowMessage («сделана работа ");
конец;

>> Поэтому мне нужно передать то содержание к резьбе как-то

вы можете передать к резьбе все параметры, котор вы любите через свое конструктор. Например:

  TEmailThread = тип (TThread)
  приватно
    FSubject: шнур;
  защищено
    процедура исполняет; преодоление автоматического действия;
  публика
    конструктор создается (const ASubject: шнур);
  конец;

конструктор TEmailThread.Create (const ASubject: шнур);
начните
  унаследовано создайтесь (True);
  FSubject: = ASubject;
конец;

процедура TEmailThread.Execute;

        // using местный var
        IdMsg.Subject: = FSubject; // было IdMsg.Subject: = edit2.text;
Другие решения  
  •  Как я добавляю кнопки на форме PDF для того чтобы добавить/извлекаю рядки данных?
  •  Шнур ошибки в блоке задвижки?
  •  сколько вариант сервера SQL на одной машине
  •  Внешний вид 2007 не может архивный файл открытой сети сохраненный
  •  Активно директория DNS записывает вопрос
  •  Отчет о доступа 2010 экспорта к CSV с коллекторами?
  •  Прокладчик OCE 9400 не начинает
  •  как добавить десятичное место в формуле в отчете о кристалла seagate
  •  Windows XP и Мичрософт Оутлоок и проблемы установителя Windows
  •  VB6 к VS2010 - консультации тренировки?
  •  
    programming4us programming4us