Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.09.2019, 17:37   #11
noveek
Пользователь
 
Регистрация: 26.05.2015
Сообщений: 56
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Меняйте логику потока. Передавайте ему строки где и что искать. Запись в файл может быть длительной операцией, тем более в цикле - делайте асинхронно или в нвом потоке, или потом.
Ты имеешь ввиду после синхронизации искать ? Если как то узнать что поток завис и делать Break; в for при этом потому что if terminated then Break; не выполняется
noveek вне форума Ответить с цитированием
Старый 26.09.2019, 17:41   #12
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Нет. Вы то прочитали, что там написано? Не до или после синхронизации, а вместо нее - убирать ее. Где я писал про поток завис или брек?
p51x вне форума Ответить с цитированием
Старый 26.09.2019, 17:49   #13
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

По вашему огрызку кода ничего нельзя понять.
Можно сказать только одно Synchronize вы используете как-то неправильно.
Самый простой способ. Кладёте на главную форму таймер. В таймера проверяете результат от ваших потоков и выводит его. При таком раскладе таймер будет работать в главном потоке.
Но ему нужно знать какие потоки живые. Для этого пред тем как разрушить поток вызываете Synchronize(selfDeleteThread) внутри которого удаляет свой поток из массива потоков.
Так как это код выполняется через синхронизацию, то он будет работать в главном потоке. Причём в промежутках когда таймер отработал. Чём добьётеся потоковой безопасности.
В таком алгоритме Synchronize вызывается всего один раз.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .

Последний раз редактировалось Pavia; 26.09.2019 в 17:52.
Pavia вне форума Ответить с цитированием
Старый 26.09.2019, 17:50   #14
noveek
Пользователь
 
Регистрация: 26.05.2015
Сообщений: 56
По умолчанию

Приведите пжл пример не пойму я никак всё равно ничего путёвого с таймером не вышло

Последний раз редактировалось noveek; 26.09.2019 в 19:39.
noveek вне форума Ответить с цитированием
Старый 27.09.2019, 02:31   #15
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,869
По умолчанию

Цитата:
Сообщение от noveek Посмотреть сообщение
Приведите пжл пример
Пример чего конкретно? Всей программы?
northener вне форума Ответить с цитированием
Старый 27.09.2019, 05:53   #16
noveek
Пользователь
 
Регистрация: 26.05.2015
Сообщений: 56
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Пример чего конкретно? Всей программы?
Зачем ? Пример того как должным образом работать с циклами for в многопоточном приложении
noveek вне форума Ответить с цитированием
Старый 27.09.2019, 06:46   #17
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Как и в не мнопоточной, только с пониманием, что если надолго или часто будете дергать "блокировки" будут фризи и гонки.
p51x вне форума Ответить с цитированием
Старый 27.09.2019, 07:38   #18
Pavia
Лис
Старожил
 
Аватар для Pavia
 
Регистрация: 18.09.2015
Сообщений: 2,409
По умолчанию

А может мы услжняем и ему нужно вызвать TParallel.For?
Как обезопасить переменные? Локальные переменные и параметры функций в защите не нуждаются так как располагаются в разных участках памяти. Поэтому обращения к ним не пересекается.
Общие переменные для потоков должны быть защищены. А также ввод и вывод его тоже надо обезопасить, так как VCL не безопасен, программист должен сам позаботиться об этом используя синхронизацию.

TInterlocked применяется для синхронизации по-данным.

Пример гонка процессов:

Код:
program Project1;
{$APPTYPE CONSOLE}
{$R *.res}
uses
  System.SysUtils, System.Threading, System.SyncObjs;

var
 HalfSum:Integer; // общая переменная
procedure ParallelSum(i:Integer);
begin
 HalfSum:=HalfSum+1;
//TInterlocked.Increment(HalfSum);
 Sleep(10);
end;
var j:Integer;
begin
  HalfSum:=0;
  TParallel.For(0, 100, ParallelSum);
  WriteLn(HalfSum);
end.
Выдает неправильный результат 93
изменяем на TInterlocked.Increment получаем правильную сумму 101

TParallel.For использует пул-потоков для автоматического создания и уничтожения потоков. Много потоков плохо сказывается на производительности. Мало тоже. Вот пул-потоков время от времени определяет производительности и создает недостающие потоки или уничтожает лишние потоки.

Каждая итерация цикла выполняется параллельно во-времени. В переменную I передаётся номер цикла.

P.S. Пример с таймером выложу попозже.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
У дзен программиста программа делает то что он хотел, а не то что он написал .
Pavia вне форума Ответить с цитированием
Старый 27.09.2019, 07:41   #19
noveek
Пользователь
 
Регистрация: 26.05.2015
Сообщений: 56
По умолчанию

Ну так вот катит только for уже не несут никакой пользы

Код:
procedure th.Execute;
begin
while work do begin
  cs.Enter;

  cs.Leave;
if work then begin
Create
...
...
for i:= downto 1 do begin
//инициализирую весь текст
for j:=ishem.Count-1 downto 0 do 
//Ищу совпадения из списка в этом тексте и если нашёл сохраняю
if Pos('chtoto', gdeto.Text)>0 then begin
.Savetofile
end;
Break; если бы тут условие что выполняем Break только в случае зависания, а в остальных нет только как поймёшь то зависло или нет =( 
end;
end;
freeandnil(1);
freeandnil(2);
freeandnil(3);
Synchronize(sync);
end;
end;
Цитата:
Сообщение от Pavia Посмотреть сообщение
P.S. Пример с таймером выложу попозже.
Ты вообще не о том потоки я освобождаю freeonterminate

Последний раз редактировалось noveek; 27.09.2019 в 07:48.
noveek вне форума Ответить с цитированием
Старый 27.09.2019, 09:23   #20
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,707
По умолчанию

Может вы тему начнете читать? Вернул старый код с
Код:
for j:=ishem.Count-1 downto 0 do 
//Ищу совпадения из списка в этом тексте и если нашёл сохраняю
if Pos('chtoto', gdeto.Text)>0 then begin
и пишет, что ничего не поменялось...

Цитата:
Сообщение от noveek Посмотреть сообщение
Break; если бы тут условие что выполняем Break только в случае зависания, а в остальных нет только как поймёшь то зависло или нет =(
Если поток завис, то бесполезно внутри что-то делать, кроме смены логики.

Но вы ведь так и непоняли, что это за зависания и почему они происходят...
p51x вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
boost::thread std::thread lallollulz Общие вопросы C/C++ 2 11.09.2019 00:48
Итерационные циклы, циклы с фактериалами, вообще не могу догнать( помогите плиз! Svetlana_ Помощь студентам 2 01.11.2015 18:58
C++ Thread и WIN API Pir C++ Builder 2 13.01.2014 12:12
thread slipp Win Api 2 24.11.2013 03:11
Thread и MVC OnlyFart ASP.NET 0 06.05.2011 11:12