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

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

29.08.2010, 11:10. Показов 26397. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
Модель здравосохранения 18. Чем здоровее работник, тем быстрее выгорает
anaschu 24.05.2026
Имитационная модель корпоративного здравоохранения: что показывает математика Сегодня в модели рабочего коллектива на AnyLogic появились три новые механики — выгорание через накопленную усталость,. . .
Модель здравосохранения 17. Планы на выгорание
anaschu 23.05.2026
Вот конкретная схема реализации: В классе Работник добавить: накопленнаяУсталость — растёт каждый час работы, снижается в перерывы и болезни коэффициентПрезентеизма — снижает продуктивность. . .
Изменение цветов в палитре gif файла aka фавикона
russiannick 23.05.2026
Изменение цветов в палитре gif файла, юзаемого как фавиконка в составе html-файла, помещенная в base64, средствами нативного Java Script, навеянное сном в майский день. Для работы необходим браузер,. . .
Модель здравосохранения 16. Слишком хорошие и здоровые сотрудники уходят, недовольные зарплатой
anaschu 23.05.2026
Отладка увольнений и настройка производительности Сегодня во второй половине дня разобрались с механикой увольнений и настроили коэффициент сложности заданий. Вот что было сделано. . . .
Как я стал коммунистом))) Модель сохранения здоровья сотрудников, запись блога номер 15
anaschu 23.05.2026
Внезапно хорошее здоровье сотрудников не нужно капиталистам?))
Модель здравоСохранения 15. Как мы чинили AnyLogic модель рабочего коллектива: сочленение диаграммы состояний болезней и поломок в ресурспул
anaschu 23.05.2026
Как мы чинили AnyLogic модель рабочего коллектива Сегодня разобрались с пятью багами, из-за которых модель либо падала с ошибкой, либо давала совершенно бессмысленные результаты. Каждый баг был. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru