Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
Delphi 6-7

Как синхронизировать потоки в Application Console?

07.09.2021, 21:38. Показов 3563. Ответов 36
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, создаю многопоточное Application Console приложение, но потоки в нём не синхронизируются стандартно
Synchronize(sync); просто не работает как правильно это сделать ?

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
program Project1;
 
{$APPTYPE CONSOLE}
 
{th}
 
constructor th.create(createsuspended: boolean);
begin
inherited Create(CreateSuspended);
Doterminate;
end;
 
procedure th.Execute;
var
// var var var
begin
inherited;
while work do begin
cs.Enter;
inc(...);
if .. = ... then work=false;
cs.Leave;
if work then begin
//... code code
end;
Synchronize(sync); // Not Work
end;
end;
 
procedure th.sync;
begin
Writeln('Synchronize ok'); // None (
end;
 
var
//
Work:=True;
for potok:=0 to 100 do
th.Create(false);
Readln;
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.09.2021, 21:38
Ответы с готовыми решениями:

Как перевести Console Application в Windows Application
Imports System.Console Module Module1 Sub Main() Dim S() As Char WriteLine("Введiть те, що хочите...

Как синхронизировать потоки?
Есть метод с параметрами, данный метод будет использоваться в трех разных потоках. Параметры задаются в цикле, как сделать, чтобы эти...

Как синхронизировать потоки?
Разбираюсь с legacy-кодом. Наткнулся на такой фрагмент в фоновом потоке: private void loadAddresses() throws URISyntaxException,...

36
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
13.09.2021, 03:20  [ТС]
Студворк — интернет-сервис помощи студентам
Я короче нашёл уже на каком то Японском форуме, ответить нормально очевидно сложно было

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
TMyThread = class(TThread)
protected
  FIsIdle: boolean; 
  procedure Execute; override;
  procedure MyMethod;
public
  property IsIdle : boolean read FIsIdle write FIsIdle; //you should use critical section to read/write it
end;
 
procedure TMyThread.Execute;
begin
  try
    while not Terminated do
    begin
      Synchronize(MyMethod);
      Sleep(100);
    end;
  finally
    IsIdle := true;
  end;
end;
 
//thread destroy;
lMyThread.Terminate;
while not lMyThread.IsIdle do
begin
  CheckSynchronize;
  Sleep(50);
end;
0
 Аватар для krapotkin
6854 / 4680 / 1465
Регистрация: 14.04.2014
Сообщений: 20,684
Записей в блоге: 21
13.09.2021, 07:11
совершенно не понял, что же тут есть такое что вам еще не сказали в предыдущих постах

и для чего этот цикл while not terminated ?
у вас поток должен в каком-то цикле ходить? почему про это ничего нет в вопросе

совершенно неясно, что решает этот кусок кода, где написано используйте CS но самой CS нет?

одни вопросы
но раз автор доволен, так тому и быть
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
13.09.2021, 09:09  [ТС]
Смотри критическая секция останавливает потоки пока не выполниться кусок кода как правило чтения/записи
Синхронизация синхронизирует потоки чтобы эти самые потоки приходили к единому знаменателю верно ?
Там правда цикл ни к чему я думаю что достаточно будет:
Delphi
1
2
3
while not Terminated do 
заменить на 
if not Terminated then
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
13.09.2021, 09:22
Критическая секция - это и есть один из видов синхронизации, в данном случае применяемый для того, чтобы обеспечить целостность общих данных, к которым одновеременно имеют доступ несколько потоков.

Добавлено через 2 минуты
Цитата Сообщение от Uefi220 Посмотреть сообщение
Я короче нашёл уже на каком то Японском форуме
Тебя нагло обманули и подсунули шляпу. Японцы, они такие...
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
13.09.2021, 09:27
Синхронизация сама использует критические секции.

Добавлено через 2 минуты
Terminated это просто флаг, который дает знать потоку, что его хотят остановить из-вне.
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
13.09.2021, 09:38  [ТС]
Я в результате понял что синхронизация не то что мне нужно, просто потоки начинают чудить с циклом for в них не помогает не критическая секция не синхронизация потоки просто встают "навсегда"
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure th.Execute;
var
// var var var
begin
inherited;
while work do begin
cs.Enter;
inc(...);
if .. = ... then work=false;
cs.Leave;
if work then begin
//... code code
end;
cs.Enter;
if ... then
for i:=1000 downto 1 do begin
list.addstrings(strings);
for int:=ishem.Count-1 downto 0 do
if Pos(ishem[int], list.Text)>0 then begin
...
cs.Leave;
end;
end;
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
13.09.2021, 09:44
С такой обработкой потоки не нужны, максимум 1 поток. Потому, что вся работа идет с глобальным объектом и критическая секция на все время работы, потоки будут работать последовательно, а не параллельно.
0
Житель Земли
 Аватар для DenNik
3004 / 3026 / 390
Регистрация: 26.07.2011
Сообщений: 11,465
Записей в блоге: 1
13.09.2021, 09:52
Цитата Сообщение от AzAtom Посмотреть сообщение
Terminated это просто флаг, который дает знать потоку, что его хотят остановить из-вне.
Даже так: Terminated - это просто флаг, используя который, программист управляет жизнью потока )

Добавлено через 2 минуты
Цитата Сообщение от Uefi220 Посмотреть сообщение
понял что синхронизация не то что мне нужно
Я мы всё ещё нихрена не поняли. Ты постоянно приводишь обгрызки кода с троеточиями, двоеточиями и закомментированной секцией var

А потом возникает удивление
Цитата Сообщение от Uefi220 Посмотреть сообщение
на главный вопрос ответ не дан
и
Цитата Сообщение от Uefi220 Посмотреть сообщение
потоки начинают чудить
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
13.09.2021, 12:19
Цитата Сообщение от Uefi220 Посмотреть сообщение
cs.Enter;
if ... then
for i:=1000 downto 1 do begin
list.addstrings(strings);
for int:=ishem.Count-1 downto 0 do
if Pos(ishem[int], list.Text)>0 then begin
...
cs.Leave;
Существуют простые правила работы с критической секцией.
1. Код внутри КС должен работать максимально быстро, для уменьшения задержек других потоков.
2. В критической секции нельзя использовать цикл, в противном случае параллельность вырождается в последовательность.
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
13.09.2021, 12:24  [ТС]
Ты имеешь ввиду как то параллельным потоком это проделывать а как ?
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
13.09.2021, 15:20
Цитата Сообщение от Uefi220 Посмотреть сообщение
а как ?
Лучше бы написал, что конкретно нужно сделать, а то получается игра в "угадай, что лучше подойдёт ТС".
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
13.09.2021, 15:58
Цитата Сообщение от Пытливый Посмотреть сообщение
2. В критической секции нельзя использовать цикл, в противном случае параллельность вырождается в последовательность.
Я как-то распараллеливал обработку массива.
Создал пачку потоков, виртуально разделил массив на секции и запустил каждый поток обрабатывать каждую секцию. Т.е., циклы внутри каждого потока крутились, но друг-другу не мешали.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
13.09.2021, 16:00
Constcat, но ведь это было не в одной области через критические секции? Потому и крутилось параллельно.
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
13.09.2021, 16:26
Цитата Сообщение от AzAtom Посмотреть сообщение
Constcat, но ведь это было не в одной области через критические секции? Потому и крутилось параллельно.
Да, разумеется. Я просто смутно и интуитивно ощущаю, что ТС хочет что-то типа такого. Поэтому и закинул удочку на тему распараллеливания обработки массива.
0
Модератор
4153 / 2362 / 814
Регистрация: 15.11.2015
Сообщений: 9,495
13.09.2021, 16:46
Constcat, вполне возможно. Выложит полностью задачу, тогда будет видно. А пока не понятно, что он хочет.
0
-11 / 9 / 1
Регистрация: 20.06.2021
Сообщений: 790
20.09.2021, 07:12  [ТС]
И как в потоках работать с циклом for правильно в результате ?
0
 Аватар для Пытливый
3764 / 2272 / 705
Регистрация: 29.05.2013
Сообщений: 9,622
20.09.2021, 10:05
Цитата Сообщение от Uefi220 Посмотреть сообщение
И как в потоках работать с циклом for правильно в результате ?
1. Каждая итерация цикла должна проверятся на Terminated
2. Критическая секция помещается внутрь цикла
3. Отказаться от прямого обращения к визуальным компонентам, используя механизм собственных событий.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.09.2021, 10:05

Как правильно синхронизировать потоки?
По нажатию кнопки создается N потоков (в данном случае 5): Thread threads = new Thread; for (int i = 0; i <...

Как синхронизировать потоки и окно ShowDialog?
Здравствуйте, только начинаю осваивать C# .NET. В процессе написания приложения windows forms столкнулся со следующей дилеммой: Есть некий...

Разница запуска функция Console Application и VCL Forms Application
Ситуация следующая. Есть устройство подключенное к компу посредством USB и библиотека для работы с ним с тремя функциями. Есть два проекта...

как написать в Console application
помогите написать выражение (-1)^n в Console application!

Как реализовать сессии в Console Application
Собственно вопрос в заголовке. Интересует именно консольное приложение.


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

Или воспользуйтесь поиском по форуму:
37
Ответ Создать тему
Новые блоги и статьи
Часы электронные
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