![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Форумчанин
Регистрация: 10.02.2009
Сообщений: 815
|
![]()
Всем доброго времени суток!
Делаю многопоточное приложение (в дебаг моде присутствует консолька). Суть: каждый поток при некоторых событиях и результатах работы должен добавлять в общий лог сообщения и менять некоторые переменные. Во многих источниках пророчат страшные муки тем кто не до конца обдумал работу с вводом/выводом данных из потока (с чтением записью переменных в общем) посему вопрос: Хватит ли для подобных действий критической секции? а именно в Код:
Код:
P.S. как я понял Synchronize более "актуален и применим" в оконных приложениях? Спасибо! |
![]() |
![]() |
![]() |
#2 |
Старожил
Регистрация: 17.11.2010
Сообщений: 18,922
|
![]()
Да все нормально, для этого и придуманы критические секции
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
|
![]() |
![]() |
![]() |
#3 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]()
Synchronize - это более сильное ограничение, чем критическая секция.
В большинстве случаев достаточно критической секции. При условии, конечно, что вы правильно её используете. Но это я руками в воздухе помахал. Кокретику, не видя вашего кода, не скажешь.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
![]() |
![]() |
![]() |
#4 |
Старожил
Регистрация: 13.08.2009
Сообщений: 2,581
|
![]()
Посмотрите ещё: http://www.gunsmoker.ru/2011/04/blog-post.html
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
|
![]() |
![]() |
![]() |
#5 | |
Форумчанин
Регистрация: 10.02.2009
Сообщений: 815
|
![]()
Спасибо, статью прочитал, но это немного не то. В своих программах стараюсь действовать описанными методами давно
![]() А псевдо код такой: Цитата:
![]() |
|
![]() |
![]() |
![]() |
#6 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
а нет ли смысла перенести секцию и её применение внутрь самого LogManager?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#7 |
Форумчанин
Регистрация: 10.02.2009
Сообщений: 815
|
![]()
у меня на данном этапе выглядит так:
Код:
![]() Последний раз редактировалось Lime; 21.10.2011 в 01:28. |
![]() |
![]() |
![]() |
#8 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
я про это и говорил, чтоб поток вызывая PrintSyncMessage, не заботился про синхронизацию.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
#9 |
Форумчанин
Регистрация: 10.02.2009
Сообщений: 815
|
![]()
сложно сформулировать
![]() Как я понял пока код внутри крит секции не отработает - дальше не пройдёт, по сему я не представляю как это организовать, мне кажется нужно создавать отдельный(лишний) поток который будет добавлять сообщение в лог, чтобы "основной из рабочих" потоков продолжал работать не отвлекаясь на очередь доступа к крит секции. как-то так ... А в том коде который я привёл выше получается что поток всёравно доходит до критический секции и вынужден ждать фактического добавления сообщения в лог. Последний раз редактировалось Lime; 21.10.2011 в 01:41. |
![]() |
![]() |
![]() |
#10 |
Старожил
Регистрация: 28.01.2009
Сообщений: 21,000
|
![]()
только потоки встающие в очередь за секцию(на вход) будут стопорится, что вполне естественно.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел. Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите. |
![]() |
![]() |
![]() |
|
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Многопоточность. Ошибка продолжения (возобновления) потока. | RobSys | Общие вопросы Delphi | 8 | 01.03.2011 01:30 |
Многопоточность. Ведение логов из каждого потока. Проблемы | Человек_Борща | Общие вопросы Delphi | 3 | 07.01.2011 18:22 |
Доступ к функциям и структурам из потока | MAIN_ELF | Общие вопросы C/C++ | 2 | 04.10.2010 15:08 |
Многопоточность с глобальной переменной | Шульц | Общие вопросы Delphi | 1 | 30.01.2010 18:19 |
Имя переменной как переменная. Как получить доступ к такой переменной? | Denni | Microsoft Office Access | 8 | 02.04.2009 10:06 |