Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.54/125: Рейтинг темы: голосов - 125, средняя оценка - 4.54
37 / 15 / 3
Регистрация: 15.07.2010
Сообщений: 326

[Delphi] Многопоточность

29.08.2010, 11:10. Показов 26548. Ответов 67
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Интерисует след. вопрос:
"Как сделать создание потоков? (кол-во зависит от того сколько укажет пользователь)"

Хотелось бы увидеть "готовый код", лазя по гуглу оч много информации, но там слишком много лишнего текста читая который тупо мозг взрывается ))

Добавлено через 4 минуты
+ как сделать синхронизацию (Первый пост редактировать не могу, проблемы в опере...)

Добавлено через 19 часов 3 минуты
Есть следующие строчки
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
  TNewThread = class(TThread)
  private
  protected
    procedure Execute; override;
  public
    constructor Create(CreateSuspended: Boolean);
  end;
 
constructor TNewThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
end;
 
 
procedure TNewThread.Execute;
begin
 
end;
 
 
 TNewThread.Create(false);
Если последнюю строчку я зациклю циклом for у меня будут создаваться новые потоки? или будет циклиться один?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
29.08.2010, 11:10
Ответы с готовыми решениями:

Многопоточность в Delphi
Доброго времени суток однако, люди помоги, есть следующая задача: нужно создать программу которая вычисляет простоту числа 3-мя потоками,...

Подскажите где можно почитать про многопоточность в Delphi
Всем привет! Из названия темы уже ясно, что мне нужна информация по многопоточности в Delphi. Дайте пару линков где можно найти почитать...

Что лучше брать Delphi XE2, Delphi XE, Delphi 7?
Привет форумчане! У меня вопрос: что лучше брать Delphi XE2, Delphi XE, Delphi 7? Как вообще различаются серия Delphi XE, и Delphi 7?

67
 Аватар для Vas-e-na
420 / 417 / 79
Регистрация: 21.06.2010
Сообщений: 1,362
16.09.2010, 20:12
Студворк — интернет-сервис помощи студентам
ну как бы это глупый код, хотя я особо и не понимаю чего ты этим хочешь добится, ибо свойство freeonterminate отвечает за то что после того как Execute потока отработала поток остался жив или же умер.... поэтому устанавливать это свойство нужно перед запуском потока... а не как то просто на клик на кнопке (это бессмыслено ибо нет привязки к запуску потока - т.е. точки относительно которой можно оценивать правильность кода)
1
37 / 15 / 3
Регистрация: 15.07.2010
Сообщений: 326
16.09.2010, 20:36  [ТС]
Цитата Сообщение от Vas-e-na Посмотреть сообщение
ну как бы это глупый код, хотя я особо и не понимаю чего ты этим хочешь добится, ибо свойство freeonterminate отвечает за то что после того как Execute потока отработала поток остался жив или же умер.... поэтому устанавливать это свойство нужно перед запуском потока... а не как то просто на клик на кнопке (это бессмыслено ибо нет привязки к запуску потока - т.е. точки относительно которой можно оценивать правильность кода)
а что тогда писать? Terminate? или Terminated? смысл в том чтобы после нажатия кнопки стоп программа удаляла созданные потоки, я попробовал FreeOnTerminate:=True; потоки останавливаются но не удаляются, активности нет, но файрвол их видит...

Добавлено через 3 минуты
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.Button1Click(Sender: TObject);
var
p:Integer;
i:word;
begin
try
p:=StrToInt(Edit1.Text);
  hSemaphore:=CreateSemaphore(nil,1,1,nil);
  for i:=0 to p-1 do
  begin
    aIdHTTP[i]:=TIdHttp.Create(Self);
    aThread[i]:=TIThread.Create(aIdHTTP[i], true);
    aThread[i].FreeOnTerminate:=true;
    aThread[i].priority := tplowest;
    aThread[i].Resume;
  end
  except
я правильно приоритет потоку задал?
0
 Аватар для Vas-e-na
420 / 417 / 79
Регистрация: 21.06.2010
Сообщений: 1,362
16.09.2010, 20:55
Цитата Сообщение от WestSide072 Посмотреть сообщение
а что тогда писать? Terminate? или Terminated? смысл в том чтобы после нажатия кнопки стоп программа удаляла созданные потоки, я попробовал FreeOnTerminate:=True; потоки останавливаются но не удаляются, активности нет, но файрвол их видит...
есстественно Terminate потому что это процедура а Terminated и FreeOnTerminate это свойства
Delphi
1
Thread.Terminate
хотя в нашем случае можно и так:
Delphi
1
Thread.Terminated:=true;
но именно в нашем потому что мы установили свойство FreeOnTerminate в true, если бы оно было false то поток бы закончил работу но не уничтожился... поэтому первый вариант приоритетнее...

Добавлено через 1 минуту
Цитата Сообщение от WestSide072 Посмотреть сообщение
я правильно приоритет потоку задал?
ну похоже на истину, я к сожалению с приотетами не работал, не было нужды, потоков было мало...
0
0 / 0 / 0
Регистрация: 13.12.2013
Сообщений: 18
13.12.2013, 10:15
начинаю изучать многопоточность. в принципе в данном примере есть всё, что нужно (моя программа работает, ставит потоки на паузу, завершает потоки.

теперь как мне отследить количество активных потоков (при завершении), чтобы дождаться полного их завершению проделать кое какие операции с результатами?

понимаю, что тема старая, но с нетерпением жду ответа

Добавлено через 1 час 6 минут
запускать цикл проверки каждого потока по значению Terminated ?
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
13.12.2013, 10:30
Можно сделать через семафоры:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
var
  ThreadsCount: Integer;
begin
  while True do
  begin
    case WaitForSingleObject(hSemaphore, 0) of
    WAIT_OBJECT_0:
    begin
      ReleaseSemaphore(hSemaphore, 1, @ThreadsCount);
      if ThreadsCount = MaxThreads - 1 then
        Break;
    end;
    WAIT_TIMEOUT: ;
    end;
  end;
end;
или через WaitForMultipleObjects
0
0 / 0 / 0
Регистрация: 13.12.2013
Сообщений: 18
13.12.2013, 10:59
я может быть не совсем понятно выразился, а может не правильно прочитал ваш ответ.

по данному примеру. вот я завершаю потоки
Delphi
1
2
3
4
for i:=0 to p-1 do
    begin
      aIThread[i].Terminate;
    end
как вывести например в label или прогресс бар количество активных потоков?
просто после их остановки видно, как некоторые с запозданием завершаются (выводят результат работы)

Добавлено через 2 минуты
Delphi
1
ReleaseSemaphore(hSemaphore, 1, @ThreadsCount);
тут количество активных потоков? или тех, что созданы?
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
13.12.2013, 11:06
aIThread[i].Terminate - это просто установка флага, который может быть использован для организации завершения работы потока, но к фактическому завершению он не имеет никакого отношения.

Добавлено через 3 минуты
Вывод кол-ва существующих потоков:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
var
  CurrentThreadsCount: Integer;
begin
  case WaitForSingleObject(hSemaphore, 0) of
  WAIT_OBJECT_0:
  begin
    ReleaseSemaphore(hSemaphore, 1, @CurrentThreadsCount);
    CurrentThreadsCount := Pred(MaxThreads - CurrentThreadsCount);
  end;
  WAIT_TIMEOUT:
    CurrentThreadsCount := MaxThreads;
  end;
 
  Label1.Caption := Format('Threads =  [%d]', [CurrentThreadsCount]);
1
 Аватар для Mawrat
13117 / 5898 / 1708
Регистрация: 19.09.2009
Сообщений: 8,809
13.12.2013, 11:26
Цитата Сообщение от yoshimidzo Посмотреть сообщение
теперь как мне отследить количество активных потоков (при завершении), чтобы дождаться полного их завершению проделать кое какие операции с результатами?
Заводится целочисленная переменная (счётчик) - Cnt : Integer = 0. Перед запуском каждого потока следует выполнять: Inc(Cnt), а при останове каждый поток самостоятельно выполняет: Dec(Cnt). Таким образом, когда счётчик Cnt обнулится, это будет означать, что все потоки завершили свою работу. Каждому потоку можно назначить обработчик события OnTerminate. И в этом обработчике выполнять Dec(Cnt). Кроме этого, в этом обработчике следует выполнять проверку if Cnt = 0 then. Если условие выполнилось, то форме посылается сообщение, извещающее, что все потоки завершены. И в классе формы, соответственно, следует определить обработчик этого сообщения.

Более удобно вместо счётчика завести список, например, типа TList. И в этом списке хранить ссылки на выполняющиеся потоки. Т. е., перед запуском очередного потока следует добавлять ссылку на него в список. А в обработчике события OnTerminate удалять ссылку на тот экземпляр TThread, который вызвал этот обработчик. И далее, если TList.Count = 0, то посылать форме соответствующее сообщение.
1
0 / 0 / 0
Регистрация: 13.12.2013
Сообщений: 18
13.12.2013, 12:37
Цитата Сообщение от FIL Посмотреть сообщение
aIThread[i].Terminate - это просто установка флага, который может быть использован для организации завершения работы потока, но к фактическому завершению он не имеет никакого отношения.
а
Delphi
1
aIThread[i].FreeOnTerminate:=true;
при запуске не подразумевает этого?
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
13.12.2013, 14:08
Нет, это подразумевает, что поток автоматически уничтожится после окончания своей работы.
0
0 / 0 / 0
Регистрация: 13.12.2013
Сообщений: 18
13.12.2013, 14:57
в процедуре TIThread.Execute ставить проверку на terminated и если да, то Free; ?
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
13.12.2013, 15:01
Можно просто - Exit.
1
0 / 0 / 0
Регистрация: 13.12.2013
Сообщений: 18
14.12.2013, 13:13
Цитата Сообщение от FIL Посмотреть сообщение
Нет, это подразумевает, что поток автоматически уничтожится после окончания своей работы.
после того как он дойдет до последнего end ?
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
14.12.2013, 13:19
Когда процедура Execute завершится.
0
0 / 0 / 0
Регистрация: 13.12.2013
Сообщений: 18
14.12.2013, 13:24
Цитата Сообщение от FIL Посмотреть сообщение
Когда процедура Execute завершится.
ну если я не делаю никаких циклов, проверок, а просто допустим добавляю строку в мемо,
то он завершится автоматически после добавления строки? так получается? (при условии, что я вконце скомандовал Terminate)
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
14.12.2013, 13:34
Он завершится автоматически без всяких доп. команд.
0
0 / 0 / 0
Регистрация: 13.12.2013
Сообщений: 18
14.12.2013, 13:59
Цитата Сообщение от FIL Посмотреть сообщение
Он завершится автоматически без всяких доп. команд.
тогда суть завершения по требованию сводится к выходу из цикла? неужели всё так просто?
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
14.12.2013, 14:17
К завершению процедуры Execute - циклов может быть несколько, а может вообще не быть.
1
0 / 0 / 0
Регистрация: 13.12.2013
Сообщений: 18
15.12.2013, 10:57
спс понял, осталось еще про семафоры почитать

Добавлено через 18 часов 0 минут
подскажите, я правильно пользуюсь семафором?

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
procedure TIThread.Execute;
var s:string;
    SListT: TStringList;
begin
  idHttp.HandleRedirects:=True;
  Inc(Cnt);
 
  while ((Form1.mmo1.Lines.Strings[0] <> '') and (form1.mmo1.Lines.Count>0)) and (Form1.CheckBox2.Checked) do
    begin
      WaitForSingleObject(hSemaphore,INFINITE);
      s:=Form1.mmo1.Lines.Strings[0];
      form1.mmo1.Lines.Delete(0);
      ReleaseSemaphore(hSemaphore,1,nil);
      
      s:= StringReplace(s, 'https://', 'http://', [rfReplaceAll, rfIgnoreCase]);
      SListT:=TStringList.Create;
      SListT.Text:=Utf8ToAnsi( idHttp.Get(s+'/?xml=1'));
 
      WaitForSingleObject(hSemaphore,INFINITE);
      Form1.Memo1.Lines.Add(SListT.Text);
      Form1.Memo1.Lines.Add('==================================');
      Form1.MLog.Lines.Insert(0, DateTimeToStr(Now)+' XXXXXXXXXXXXXX XXXXXXXID: '+s);
      Form1.MLog.Lines.Insert(0, DateTimeToStr(Now)+' XXXXXXXXXXXXXXXXXXXXXXXXXX '+inttostr(Length(SListT.Text))+' XXX');
      ReleaseSemaphore(hSemaphore,1,nil);
    end;
  Dec(Cnt);
end;
в потоке 2 момента, которые не пропускают дальнейшее выполнение, если семафор занят.

после чтения и удаления строки (первый этам семафора) начинается полезные действия, для записи результата опять жду семафора.
0
Модератор
 Аватар для FIL
3492 / 2614 / 742
Регистрация: 19.09.2012
Сообщений: 7,977
15.12.2013, 12:14
В данном случае надо использовать метод Synchronize, а не семафоры.
И подсчет кол-ва потоков так правильно работать не будет.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
15.12.2013, 12:14

Многопоточность
Видел много статей по многопоточности,но мне надо просто самое основное. var s:string; begin s:='qwe'; showmessage(s); ...

Многопоточность
Гуглил, информации в интернете много, даже слишком, поэтому голова уже взрывается. Суть проблемы: есть форма, есть цикл, при работе цикла...

Многопоточность
Добрый день. Возникал у меня следующая проблема. Пишу программу по расчетам фазового равновесия пар-жидкость. В основном достаточно сложная...

Многопоточность
Здравствуйте! Прошу помочь реализовать многопоточность. Написал брут, когда запускаю в 1 поток, всё идёт ок, как запускаю в 2 и более всё...

многопоточность
Всем привет! Вопрос в следующем: файл скачивается из интернета с помощью следующей функции: function GetInetFile(const fileURL,...


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru