Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 5

Перенос процедуры из события в поток

18.11.2014, 22:45. Показов 1189. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, уважаемые!
С написание простейших программ сталкиваюсь крайне редко, но бывает. И сегодня мне нужна Ваша помощь.
Сделал все как нужно, почти все хорошо работает, но не хватает плавности. И решил перенести процедуру в отдельный поток, но не нашел толкового описания, как это сделать. Подскажите, кто знает, буду очень признателен!
Перенести нужно вот это плюс по мелочам, но это уже сам разберусь.
P.S. Не спамер, просто есть необходимость отправлять файлы на свой ящик.

Delphi
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
function SendToRaw(const MailFrom, MailTo, SMTPHost: string;
  const MailData: TStrings; const Username, Password: string): Boolean;
var
  SMTP: TSMTPSend;
  s, t: string;
begin
  Result := False;
  SMTP := TSMTPSend.Create;
  try
// if you need SOCKS5 support, uncomment next lines:
    // SMTP.Sock.SocksIP := '127.0.0.1';
    // SMTP.Sock.SocksPort := '1080';
// if you need support for upgrade session to TSL/SSL, uncomment next lines:
    SMTP.AutoTLS := True;
// if you need support for TSL/SSL tunnel, uncomment next lines:
    // SMTP.FullSSL := True;
    SMTP.TargetHost := Trim(SeparateLeft(SMTPHost, ':'));
    s := Trim(SeparateRight(SMTPHost, ':'));
    if (s <> '') and (s <> SMTPHost) then
      SMTP.TargetPort := s;
    SMTP.Username := Username;
    SMTP.Password := Password;
    if SMTP.Login then
    begin
      if SMTP.MailFrom(GetEmailAddr(MailFrom), Length(MailData.Text)) then
      begin
        s := MailTo;
        repeat
          t := GetEmailAddr(Trim(FetchEx(s, ',', '"')));
          if t <> '' then
            Result := SMTP.MailTo(t);
          if not Result then
            Break;
        until s = '';
        if Result then
          Result := SMTP.MailData(MailData);
      end;
      SMTP.Logout;
    end;
  finally
    SMTP.Free;
  end;
end;
 
procedure Tfilesender.bstartClick(Sender: TObject);
var xMsg: TMimeMess; atta: string; xMIMEPart: TMimePart; i,f,s: integer;
begin
  s:=StrToInt(lblstartsub.Text)-1;
  f:=StrToInt(lblstartfile.Text)-1;
  for i:= 0   to StrToInt(lblmailamo.Text)-1 do
   begin
   lst1.Items.Add('['+TimeToStr(Now)+'] Sending "'+FileListBox1.Items[f+i]+'" witch subj "'+lst2.Items[s+i]+'"...' ) ;
  stat1.Panels[2].Text:='Sending '+ IntToStr(i+1)+' from '+ lblmailamo.Text;
  xMsg:=TMimeMess.Create;
  try
    xMsg.Header.Subject:=lst2.Items[s+i]; {òåìà ñîîáùåíèÿ}
    xMsg.Header.From:=lblfrom.Text;        {èìÿ è àäðåñ îòïðàâèòåëÿ}
    xMsg.Header.ToList.Add(lblto.Text);  {èìÿ è àäðåñ ïîëó÷àòåëÿ}
    xMIMEPart:=xMsg.AddPartMultipart('alternative',nil);
    xMsg.AddPartBinaryFromFile(FileListBox1.Directory +'\'+ FileListBox1.Items[f+i],xMIMEPart);
    xMsg.EncodeMessage;
    if not SendToRaw(lblfrom.Text,lblto.Text,lblhost.Text,xMsg.Lines,lbllogin.Text,lblpassword.Text)
      then ShowMessage('Ïèñüìî íå îòïðàâëåíî');
  finally
    xMsg.Free;
  end;
  sleep(StrToInt(lblsenddelay.Text)*1000);
    lst1.Items.Add('['+TimeToStr(Now)+'] Sending "'+FileListBox1.Items[f+i]+'" witch subj "'+lst2.Items[s+i]+'" COMPLETE!' );
    //lst1.Items.Add('s = '+inttostr(s)+'; f = '+inttostr(f));
    if s<0  then lst1.Items.Add('['+TimeToStr(Now)+'] Not enough subjects!');
    if f<0 then lst1.Items.Add('['+TimeToStr(Now)+'] Not enough files!');;
    if s<0  then Break;
    if f<0  then Break;
    end;
    lst1.Items.Add('['+TimeToStr(Now)+'] ALL DONE!');
    stat1.Panels[2].Text:='Complete!';
  end;
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.11.2014, 22:45
Ответы с готовыми решениями:

Перенос массива из класса события в другой класс события
есть вот такой код: private void button_follow_Click(object sender, EventArgs e) { if...

Разделить поток когда еще нет события ?
как направлять поток агентов, в ту очередь, которая меньше ? :(

Как заставить поток ожидать любого события?
Делаю класс по гайду с msdn вот. Но немного переделал, так что бы было похоже на BackgroundWorker. По факту есть события: public...

5
пофигист широкого профиля
4769 / 3204 / 862
Регистрация: 15.07.2013
Сообщений: 18,609
19.11.2014, 02:47
Цитата Сообщение от eshardy Посмотреть сообщение
Сделал все как нужно, почти все хорошо работает, но не хватает плавности. И решил перенести процедуру в отдельный поток
Ну да. Поток это волшебная палочка. Кто её получил/создал, тот волшебник.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.11.2014, 09:35
Цитата Сообщение от eshardy Посмотреть сообщение
не хватает плавности
какой такой "плавности" ?)
0
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 5
19.11.2014, 09:50  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
какой такой "плавности" ?)
программа подвисает во время выполнения цикла, счетчик отрисовывается только после завершения операции.
0
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
19.11.2014, 10:02
Ну так ты просто шмякни на форму IdAntifreeze - и будет тебе "плавность")
Оно конечно есть костыль, но это же не повод сразу бросаться голой ж. на амбразуру - переделывать логику на мультипоточную при полном отсутствии знаний)
1
0 / 0 / 0
Регистрация: 18.11.2014
Сообщений: 5
19.11.2014, 10:03  [ТС]
Цитата Сообщение от mss Посмотреть сообщение
Ну так ты просто шмякни на форму IdAntifreeze - и будет тебе "плавность")
Оно конечно есть костыль, но это же не повод сразу бросаться голой ж. на амбразуру - переделывать логику на мультипоточную при полном отсутствии знаний)
Спасибо, попробую! а насчет амбразуры да, согласен)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
19.11.2014, 10:03
Помогаю со студенческими работами здесь

Как остановить главный поток до момента выполнения определенного события?
Подскажите как остановить главный поток до момента выполнения определенного события?

Передача в поток CALLBACK процедуры
Создал потомка TThread под свои нужды: Type TThreadIO = Class(TThread) Private FExecuteProc : TProcedure; ...

Синхронизация анонимной процедуры, переданной в поток
Несколько дней назад узнал, что Delphi может анонимные процедуры. И при замене кое-какого кода с потоками на использование таких процедур...

Дополнительный поток и внешние функции\процедуры
Приветствую Вас, победители восставших компиляторов. Возник небольшой вопрос, в проге есть вспомогательные модули, ну и соответственно...

Вызов процедуры события
Наверное, на примере понятнее будет: Вот есть у меня 2 процедуры, совершающиеся по клику по разным элементам: procedure...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru