![]() |
|
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]()
|
|
| stan90 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 12.11.2009 Репутация: нет Всего: нет |
здравствуйте.надеюсь что правильно выбрал раздел..
проблема в следующем. есть задание : Реализовать класс логирования в файлы. Класс должен отвечать следующим требованиям: 1) Потокобезопасность (возможность работы с одним экземпляром класса из разных потоков) 2) Асинхронная запись логов. (Запись логов не должна приводить к блокированию потоков, которые используют объект класса логов, вне зависимости от объемов информации записываемой на жесткий диск). В классе должны присутствовать публичные методы Initialize(std::string filePath); (возможно использование конструктора). WriteLog(std::string logLine); - основная рабочая функция класса, которая будет вызываться из других объектов/потоков. Задание должно быть реализованно на C++ с использованием STL в среде Microsoft Visual Studio (либо в любой другой, но без использования спецефических компонентов среды). Сторонние библиотеки в реализации применять не следует. вот то что я сделал:
вот что есть,но работает не совсем правильно,а точнее совсем видимо не правильно. C STL только-только начал знакомиться,моя первая программа. буду признателен за любую помощь и подсказки Это сообщение отредактировал(а) stan90 - 14.9.2011, 23:35 |
|||
|
||||
| GremlinProg |
|
||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
блокирования потоков, которые используют объект класса логов, не избежать, т.к. addData ставит строку в очередь с блокировкой, но это проблема формулировки самого задания в твоем случае надо реализовать сигнальную модель: поток логгера спит, пока не активируется семафор hWake, после чего, он блокирует очередь, выбирает первую строку, пишет ее в файл и снова уходит в спячку, выглядит это примерно так:
а addData выглядит примерно так:
Добавлено через 2 минуты и 5 секунд -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||||
|
|||||||
| stan90 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 12.11.2009 Репутация: нет Всего: нет |
а как тогда организовать второй поток?
и правильно ли будет выглядеть это,ведь функция статик значит доступ к вектору только через указатель?
еще вопрос как работает путь к файлу,который в качестве параметра передается конструктору?разве недостаточно ofstream? |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Угу, только записывать лучше все, что насобиралось в очереди, а не только одну строку. Хотя чаще всего она там одна и будет. Я такую штуку делала, для синхронизации использовала сочетание событие + критическая секция (для собственно блокировки). Просто обернула стандартную очередь stl. Плюс еще доп. класс Inserter, для реализации "потокового" вывода (т.е. через оператор <<) - stl так stl! Еще полезно к логу приделать UnhandledExceptionFilter, это позволяет протоколировать почти все падения. -------------------- ... |
|||
|
||||
| GremlinProg |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
поток, который использует Logger? как угодно, экземпляр Logger'а можно сделать статиком, например, тогда он будет доступен из любого потока
если доступ через указатель, это еще не значит, что код стал потоконебезопасным, потокобезопасным он стал как только были установлены и соблюдены правила синхронизации доступа к данным, а доступ к ним можно осуществлять как душе угодно, хоть словесно ) кстати, последный код неверный, смотри внимательнее на то, где расположен WaitForSingleObject
тогда будет нарушено равновесие: в данном случае, в качестве счетчика строк выступает семафор, т.е. на каждую строку его надо разрядить, иначе будут лишне срабатывания, в твоем случае, на стороне потока можно завести некоторый буфер, куда копить пару секунд ( макс. задержка выбирается опционально ) строки, если по их истечении семафор ни разу не сработает, можно писать его в файл и очищать Это сообщение отредактировал(а) GremlinProg - 16.9.2011, 06:16 -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
||||
|
|||||
| stan90 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 136 Регистрация: 12.11.2009 Репутация: нет Всего: нет |
спасибо.попробую.
а как быть с этим : как работает путь к файлу,который в качестве параметра передается конструктору?разве недостаточно ofstream? |
|||
|
||||
![]()
|
| Правила форума "C/C++: Системное программирование и WinAPI" | |
|
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |