Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.75/16: Рейтинг темы: голосов - 16, средняя оценка - 4.75
113 / 113 / 13
Регистрация: 01.10.2008
Сообщений: 876

Отправка почты в другом потоке

03.08.2009, 10:30. Показов 3400. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Народ, мне надо отправить почту в дугом потоке, чтобы програ не висла.
С помощью компонентов NMSMTP или IdSMTP.
Программу написал, в поток входит, но почту не отправляет.
Где-то читал, что в многопочных приложениях нельзя использовать VCL компоненты
Помогите кто чем может
Заранее спасибо
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.08.2009, 10:30
Ответы с готовыми решениями:

Как получить значение переменной созданной в потоке, в другом потоке?
Добрый день :) Возник такой вопрос "как получить значение переменной созданной в потоке, в другом потоке?" Не знаю, как правильно...

Работа с Dictionary в одном потоке, при этом он может изменятся в другом потоке
Здравствуйте! Я делаю лабу сервер распределенных вычислений в сети. В одном потоке ожидаю клиентов и на каждого клиента создаю поток. ...

Элементы управления, созданные в одном потоке, не могут быть родительскими для элемента управления в другом потоке
Привет :) Есть задача - нужно динамически добавлять компоненты. Все работает хорошо. Но если добавлять через цикл то начинает зависать...

20
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
03.08.2009, 10:46
Цитата Сообщение от D@rkD@iver Посмотреть сообщение
Народ, мне надо отправить почту в дугом потоке, чтобы програ не висла.
С помощью компонентов NMSMTP или IdSMTP.
Программу написал, в поток входит, но почту не отправляет.
Где-то читал, что в многопочных приложениях нельзя использовать VCL компоненты
Помогите кто чем может
Заранее спасибо
VCL объекты (GUI во всяком случае) должны создаваться только в родительском потоке (в том котором работает TApplication*), можно в основном потоке из создавать, а уже работать в разных (передавать в ф-ю потока указатель на объект). Естественно все это требует синхронизации.
0
113 / 113 / 13
Регистрация: 01.10.2008
Сообщений: 876
03.08.2009, 10:51  [ТС]
oxotnik, а как это осуществить?
и что такое синхронизация?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
03.08.2009, 10:55
Цитата Сообщение от D@rkD@iver Посмотреть сообщение
oxotnik, а как это осуществить?
и что такое синхронизация?
а как поток создаешь?
простейшая синхронизация - выставление критических секций (различные потоки не смогут одновременно изменять одни и те же данные)

в начале программы:

C++
1
2
CRITICAL_SECTIN cs;
InitializeCriticalSection(&cs);
в потоке:

C++
1
2
3
EnterCriticalSection(&cs);
pSomeObject->SomeProperty = SomeValue;
LeaveCriticalSection(&cs);
0
113 / 113 / 13
Регистрация: 01.10.2008
Сообщений: 876
03.08.2009, 11:04  [ТС]
oxotnik, поток создаю с помощью TThread
File->New->Other->Thread
и это всё? вставлю в код и будет работать?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
03.08.2009, 11:07
Цитата Сообщение от D@rkD@iver Посмотреть сообщение
и это всё? вставлю в код и будет работать?
не знаю... ты код свой не привел... я общее решение показал. А что конкретно и почему у тебя не работает - хз.
0
113 / 113 / 13
Регистрация: 01.10.2008
Сообщений: 876
03.08.2009, 11:15  [ТС]
C++
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
42
43
44
45
46
47
48
49
50
51
52
53
//   used in a method called using Synchronize, for example:
//
//      Synchronize(UpdateCaption);
//
//   where UpdateCaption could look like:
//
//      void __fastcall TMyThread::UpdateCaption()
//      {
//        Form1->Caption = "Updated in a thread";
//      }
//---------------------------------------------------------------------------
 
__fastcall TMyThread::TMyThread(bool CreateSuspended)
        : TThread(CreateSuspended)
{
}
//---------------------------------------------------------------------------
void __fastcall TMyThread::Execute()
{
        ThrTerminated= false;
        int t=true;
        int g, h;
 
        Form1->Timer2->Enabled=false;
        FreeOnTerminate= true;
        while (t)
        {
                g=true;
                h=true;
                try {
                        Form1->IdSMTP1->Connect();
                }
                catch (...)
                {
                        g=false;
                }
                try {
                        Form1->IdSMTP1->Send(Form1->IdMessage1);
                }
                catch (...)
                {
                        h=false;
                }
                t= !(g && h);
        }
        try{
                Form1->IdSMTP1->Disconnect();
        }
        catch (...) {}
 
        Form1->Timer2->Enabled=true;
        ThrTerminated= true;
}
вот код, простая отправка почты
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
03.08.2009, 11:30
а в основном потоке отправляет?
все порты настроены?Form1->IdSMTP1->Send(Form1->IdMessage1);
и
Form1->IdSMTP1->Connect();
в catch(...)
не улетают?
если улетают, то с каким исключением?
ЗЫ: с TThread не работал, за правильность его использования ничего сказать не могу.
через АПИ как то так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
typedef struct Params
{
     TIdSMTP *IdSMTP1;
     AnsiString Message;
}Params;
 
void __fastcall Button1Click (TObject *Sender)
{
      Params *pParams = new Params;
      pParams->IdSMTP1 = Form1->IdSMTP1;
      pParams->Message = Form1->IdMessage1;
      CreateThread(NULL, 0, SMTPThread , (LPVOID)pParams, NULL, NULL);
}
 
DWORD WINAPI SMTPThread (LPVOID pParam)
{
     Params *pParams = (Params*)pParam;
      EnterCriticalSection(&cs);
      pParams->IdSMTP1->Connect();
      pParams->IdSMTP1->Send(pParams->Message);
      LeaveCriticalSection(&cs);
     delete pParams;
      return 0;
}
0
113 / 113 / 13
Регистрация: 01.10.2008
Сообщений: 876
03.08.2009, 11:47  [ТС]
oxotnik, нет, в catch не улетают
а разве AnsiString Message; не TIdMessage Message?

поток начнет отправляться CreateThread(NULL, 0, SMTPThread , (LPVOID)pParams, NULL, NULL); здесь?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
03.08.2009, 11:56
Цитата Сообщение от D@rkD@iver Посмотреть сообщение
oxotnik, нет, в catch не улетают
а разве AnsiString Message; не TIdMessage Message?
я пример привел... какие конкретно параметры передавать в ф-ю отправки сообщений - см. хелп.
Цитата Сообщение от D@rkD@iver Посмотреть сообщение
поток начнет отправляться CreateThread(NULL, 0, SMTPThread , (LPVOID)pParams, NULL, NULL); здесь?
эта строка дает системе команду на запуск дочернего потока. когда этот поток запустится и начнет передавать данные - известно только системе.
0
113 / 113 / 13
Регистрация: 01.10.2008
Сообщений: 876
03.08.2009, 11:59  [ТС]
но едь он должен запуститься сразу же? иначе какой в нем смысл?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
03.08.2009, 12:06
Цитата Сообщение от D@rkD@iver Посмотреть сообщение
но едь он должен запуститься сразу же? иначе какой в нем смысл?
должен, но не обязан... все зависит от текущего состояния системы... если она сильно загружена, и на твое приложение будет выделено в час один процессорный "такт" тогда и запустится поток через час (это сильно утрировано), но в общем случае сразу и запускается
0
113 / 113 / 13
Регистрация: 01.10.2008
Сообщений: 876
03.08.2009, 12:07  [ТС]
oxotnik, а у тебя этот код работает?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
03.08.2009, 13:22
Цитата Сообщение от D@rkD@iver Посмотреть сообщение
oxotnik, а у тебя этот код работает?
не проверял, писал в браузере...
еще раз: в основном потоке твоя конструкция работает? (отладь пока в однопоточном приложении) если да, то не вижу причин по которым в дочернем потоке работать не будет.
0
113 / 113 / 13
Регистрация: 01.10.2008
Сообщений: 876
03.08.2009, 13:39  [ТС]
oxotnik, [C++ Error] Unit1.cpp(59): E2451 Undefined symbol 'CRITICAL_SECTIN'


CRITICAL_SECTIN cs;
InitializeCriticalSection(&cs); нужно писать в начале программы?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
03.08.2009, 13:43
CRITICAL_SECTION

Добавлено через 35 секунд
Цитата Сообщение от D@rkD@iver Посмотреть сообщение
CRITICAL_SECTIN cs;
InitializeCriticalSection(&cs); нужно писать в начале программы?
да
1
113 / 113 / 13
Регистрация: 01.10.2008
Сообщений: 876
03.08.2009, 13:50  [ТС]
oxotnik, Работет!!!! респект тебе, брат.
0
113 / 113 / 13
Регистрация: 01.10.2008
Сообщений: 876
04.08.2009, 14:59  [ТС]
oxotnik, у меня еще один вопрос, когда функция потока возвращает 0 (return 0) то поток уничтожается? просто мне нужно отправлятьпосту неоднократно, то есть когда поток завершиться можно не боясь опять запускать его?
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
04.08.2009, 15:01
Цитата Сообщение от D@rkD@iver Посмотреть сообщение
oxotnik, у меня еще один вопрос, когда функция потока возвращает 0 (return 0) то поток уничтожается? просто мне нужно отправлятьпосту неоднократно, то есть когда поток завершиться можно не боясь опять запускать его?
его можно запускать и не дождавшись завершения (будет несколько параллельных дочерних потоков)
если надо дождаться WaitForSingleObject (Дескриптор потока)
0
113 / 113 / 13
Регистрация: 01.10.2008
Сообщений: 876
04.08.2009, 15:08  [ТС]
oxotnik, дело в том что я использую IDSMTP в потоке, поэтому если два потока создаются, то возникает конфликт
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
04.08.2009, 15:08
Помогаю со студенческими работами здесь

Отправка почты: "необработанное исключение отправки почты в system.Dll"
подскажите - вот пример на C#, но он мне пишет "необработанное исключение отправки почты в system.dll" using System; using...

ProgressBar в другом потоке
Есть приложение, которое заносит в БД тысячи строк, соответственно форма подтормаживала, процедуру занесения вынес в отдельный поток. Хотел...

Как правильно сделать получение почты в отдельном потоке?
Всем добрый вечер. Пытаюсь получать определенные письма с почт посредством либлы mailkit. Все хорошо получается. Но программа на 3-4...

Ивент с реакцией в другом потоке
В главном потоке происходит событие, к примеру А = 5. Как сделать так чтобы на смену значения А, в другом потоке , паралельно...

QProgressBar::setValue() в другом потоке
Всем привет! Пытаюсь создать многопоточное приложение с использованием потоков std::thread. Часть кода: void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru