powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Нужна параллельная непараллельность.
23 сообщений из 23, страница 1 из 1
Нужна параллельная непараллельность.
    #39849536
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот такой выходит у меня лог работы 4 процессов.
Код: plaintext
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.
1: Processor 9604 Idle
1: Processor 1248 Idle
1: Processor 8596 Idle
1: Collector Start
5: Processor 9604 Idle
5: Processor 1248 Idle
5: Processor 8596 Idle
5: Collector Busy
9: Processor 9604 Idle
9: Processor 1248 Idle
9: Processor 8596 Idle
12: Processor 9604 Idle
12: Collector Idle
12: Processor 1248 Busy
15: Collector Busy
16: Collector Idle
17: Collector Busy
18: Processor 1248 Idle
18: Processor 8596 Busy
20: Collector Idle
21: Collector Busy
22: Collector Idle
22: Processor 8596 Idle
22: Processor 9604 Busy
25: Collector Busy
26: Collector Idle
27: Collector Busy
28: Processor 9604 Idle
28: Processor 1248 Busy
30: Collector Idle
31: Processor 1248 Idle
31: Processor 8596 Busy
33: Processor 9604 Busy
33: Processor 8596 Idle
35: Processor 9604 Idle
35: Processor 1248 Idle
35: Collector Finale
Лог формируется в двух обработчиках событий этих процессов. И там все просто:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
procedure TForm50.FileCollectorChangedState(Sender: TObject; State: TFileCollectorState);
begin
 case State of
   fcStart: Log.Lines.Add(Format('%d: Collector Start', [Log.Lines.Count+1]));
   fcIdle: Log.Lines.Add(Format('%d: Collector Idle', [Log.Lines.Count+1]));
   fcBusy: Log.Lines.Add(Format('%d: Collector Busy', [Log.Lines.Count+1]));
   fcFinale: Log.Lines.Add(Format('%d: Collector Finale', [Log.Lines.Count+1]));
 end;
end;

procedure TForm50.FileProcessorChangedState(Sender: TObject; State: TFileProcessorState);
begin
 case State of
   fpIdle: Log.Lines.Add(Format('%d: Processor %d Idle', [Log.Lines.Count+1, TFileProcessor(Sender).ThreadID]));
   fpBusy: Log.Lines.Add(Format('%d: Processor %d Busy', [Log.Lines.Count+1, TFileProcessor(Sender).ThreadID]));
 end;
end;


Работает все как надо... параллельно... но вот нумерация строк в логе не последовательная. И что делать? Заводить очередь сообщений в лог?
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39849539
DimaBr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Использовать синхронизацию
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39849541
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В каком месте? При генерации событий в процессах?
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39849545
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если очень надо в файл и он нужен один, то заводите диспетчер. Ваши процессы логируют в него, а он пишет и следит за нумерацией..
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39849547
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну да, действительно надо было сделать так:
Код: pascal
1.
2.
3.
4.
5.
procedure TFileProcessor.SetState(const Value: TFileProcessorState);
begin
 FState := Value;
 Synchronize(procedure begin if Assigned(FChangedStateEvent) then FChangedStateEvent(Self, FState); end);
end;


Теперь все выводит как надо.
Код: plaintext
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.
1: Processor 9560 Idle
2: Processor 6368 Idle
3: Processor 9560 Idle
4: Processor 6368 Idle
5: Processor 9560 Idle
6: Collector Start
7: Processor 6368 Idle
8: Processor 9560 Idle
9: Collector Busy
10: Processor 6368 Idle
11: Processor 10576 Idle
12: Processor 9560 Idle
13: Processor 6368 Idle
14: Processor 10576 Idle
15: Collector Idle
16: Processor 9560 Busy
17: Collector Busy
18: Processor 9560 Idle
19: Processor 6368 Idle
20: Processor 10576 Idle
21: Processor 9560 Idle
22: Collector Idle
23: Processor 6368 Busy
24: Collector Busy
25: Processor 6368 Idle
26: Processor 10576 Idle
27: Processor 9560 Idle
28: Processor 6368 Idle
29: Collector Idle
30: Processor 10576 Busy
31: Collector Busy
32: Processor 10576 Idle
33: Processor 9560 Idle
34: Processor 6368 Idle
35: Processor 10576 Idle
36: Collector Idle
37: Processor 9560 Busy
38: Collector Busy
39: Processor 9560 Idle
40: Processor 6368 Idle
41: Processor 10576 Idle
42: Collector Idle
43: Processor 9560 Busy
44: Collector Busy
45: Processor 9560 Idle
46: Processor 10576 Idle
47: Processor 6368 Idle
48: Processor 9560 Idle
49: Collector Idle
50: Processor 10576 Busy
51: Collector Finale
52: Processor 6368 Idle
53: Processor 9560 Idle
54: Processor 10576 Idle
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39849549
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, так неправильно. Я таким образом свел на нет работу потоков.
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39849553
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Нет, это я неправильно делаю. Нельзя использовать событие в потоке и потом его обрабатывать в основном приложении, смысл потока просто теряется, надо видимо через систему сообщений это делать.
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39849578
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СтрадалецъВ каком месте? При генерации событий в процессах?
при использовании разделяемого ресурса
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
const
  StateNames: arrayy[TFileCollectorState] of string = ('fsStart', ...);

procedure TForm50.FileCollectorChangedState(Sender: TObject; State: TFileCollectorState);
begin
  CritSec.Enter;
  try
    Log.Lines.Add(Format('%d: Collector %s', [ Log.Lines.Count+1, StateNames[State]]));
  finally
    CritSec.Enter;
  end;
end;



Log - если это VCL объект из главного потока, то напрямую к нему добавлять строки из дополнительных потоков нельзя
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39849581
Zelius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Zelius,

описка
Код: pascal
1.
2.
3.
  finally
    CritSec.Leave;
  end;
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39849619
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если задача только в наращивании счетчика, то InterlockedIncrement. Доступ к файлу система сама разрулит
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39849626
Фотография Dmitry Arefiev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Правильное логирование должно быть асинхронным, неблокирующим вызывающего, и сведенным к нулю накладные расходы на вызовы. Иначе лог покажет филькину грамоту почти в прямом смысле этого выражения :)
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39849797
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще да, поток-логгер и очередь записей в него. Только не забыть метки времени генерить при добавлении в очередь, а не при извлечении)
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39850832
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Или я чего-то не понимаю или лыжи не едут.
Переделал на сообщения и теперь параллельность испарилась. Специально замедлил обработку одним процессом и наблюдаю теперь картину последовательного выполнения процессов. Почему плин?
Запускаю 6 процессов. Каждый процесс отсылает сообщение и ждет в интервале от 50 до 500 мс. И вот что я вижу.
Так отправляю из процесса:
Код: pascal
1.
2.
3.
4.
5.
procedure TFileProcessor.SetState(const Value: TFileProcessorState);
begin
 FState := Value;
 PostMessage(Form50.Handle, FileProcessorMessage, LParam(FProcessorID), LParam(FState));
end;


а так обрабатываю сообщение:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
procedure TForm50.FileProcessorChangedState(var Msg: TMessage);
var
   State: TFileProcessorState;
   ProcessorID: Integer;
begin
 State := TFileProcessorState(Msg.LParam);
 ProcessorID := Msg.WParam;
 Log.Lines.Add(Format('%s %d: Processor %d %s', [TimeToStr(Now), Log.Lines.Count + 1, ProcessorID + 1, Indicator[State].Caption]));
 with TShape(IndicatorPanel.Components[ProcessorID])
 do begin
    Brush.Color := Indicator[State].Color[1];
    Pen.Color := Indicator[State].Color[0];
    end;
end;
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39850861
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вам лог куда выводить в файл, на форму в мемо, в бд и т.п.

Из готовых можете поставить CodeSiteExpress он в GetIt есть и поможет визуально в реалтайм посмотреть, что происходит...
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39850920
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СтрадалецъПочему плин?
Тут главное код процесса/потока не показывать, чтоб было о чем поугадывать.
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39851362
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лог, как и индикатор, сейчас мне нужны только для отладки работы класса. Нашел я слона в своем коде:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
 while not Terminated and (FFileCollector.State <> fcFinish)
 do begin
    FFileCollector.CriticalSection.Enter;
    if FFileCollector.AFileNamesCollection.Count > 0
    then begin
         State := fpBusy;
         FileName := FFileCollector.AFileNamesCollection.Dequeue;
         Sleep(RandomRange(5,50)) // Типа делает что-то
         end;
    FFileCollector.CriticalSection.Leave;
    State := fpIdle;
    Sleep(5);
    end;


Я обработку зафигачил в критическую секцию и естественно, пока у меня обработка не завершилась, все остальные процессы смирно ждали своей очереди.
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39851366
Vlad F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Страдалецъ,

Силен, бродяга. Надо будет для студентов в качестве контрпримера запомнить.
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39851415
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
Vlad FСтрадалецъ,

Силен, бродяга. Надо будет для студентов в качестве контрпримера запомнить.

И даже без try-finally. Вдвойне силён )))
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39851559
Страдалецъ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И как только раньше без try ecxept/finale писали код? Теперь не кашерно без него.
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39851564
Фотография defecator
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Модератор форума
СтрадалецъИ как только раньше без try ecxept/finale писали код? Теперь не кашерно без него.
когда не было механизмов обработки, тогда и не писали.

А TRY-EXCEPT-FINALLY появились в Дельфи, начиная с Delphi 1
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39851757
Фотография Док
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СтрадалецъИ как только раньше без try ecxept/finale писали код? Теперь не кашерно без него.
раньше и на электрогитарах без резиновых перчаток играли :)
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39851791
Фотография X-Cite
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
СтрадалецъИ как только раньше без try ecxept/finale писали код? Теперь не кашерно без него.

Есть элементарная логика и голова на плечах.. Если у вас между Enter и Leave выскочит исключение, то блокировка останется висеть..
Ну а какие "специалисты" так и писали...
...
Рейтинг: 0 / 0
Нужна параллельная непараллельность.
    #39851794
vavan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Страдалецъкак только раньше без try ecxept/finale писали код? Теперь не кашерно без негокто в дельфах гарды на интерфейсах раньше юзал тот и теперь наверное не пишет
...
Рейтинг: 0 / 0
23 сообщений из 23, страница 1 из 1
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Нужна параллельная непараллельность.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]