Задачка
|
изверг Сообщения: 39 |
Профиль | Сайт | Отправить PM | Цитировать Необходимо разработать приложение в среде VC++ 6.0 - нужно использовать MFC (dialog based application) или использовать только Win32 API. Внешне оно будет представлять из себя диалог с листбоксом, куда выводятся все сообщения о событиях в нитях (threads), см. о нитях подробнее ниже, и кнопкой "Close". При реализации предпочтительнее использовать Win32 API объекты, предназначенные для синхронизации работы нитей, а не wrapper-ы, предлагаемые библиотекой MFC для них. (Это пожелание. Если проще и удобнее использовать объекты MFC, то их также можно применять.)
Существует 2 типа нитей - "писатели" и "читатели" для одного ресурса. (Логику их работы можно сравнить с редактированием и чтением одного ресурса.) Соответственно, необходимо реализовать 2 функции для этих типов нитей - одну для "писателя" и одну для "читателя". Правила работы этих нитей: 1. Если один "писатель" пишет данные, другой "писатель" не может писать в этот момент. 2. Если один "писатель" пишет данные, другие "читатели" не могут читать данные в этот момент. 3. Если один "читатель"читает данные, никто из "писателей" не может писать данные в этот момент. 4. Если один "читатель" читает данные, то другие "читатели" также могут читать данные в этот момент. Может быть только три состояния каждой нити - выполняет операцию (чтение или запись), ждет выполнения операции (ресурс занят) и холостой режим (после выполнения операции, нить должна "заснуть" на случайное время.) Время, отводимое на выполнение этих операций случайное для каждой операции и диапазон значений задается при старте программы. Время может изменяться в диапазоне от 2 до 10 секунд. Нужно задать значения по умолчанию: время на запись должно быть больше, чем на чтение; время холостого режима также должно быть меньше у "читателей". Все задержки выполняются командой Sleep. Действительное время задержки должно вычисляться случайно для каждой операции и для каждой нити, исходя из заданного диапазона (т.е. не может быть такого, что время вычисляется только один раз на старте программы и используется одно и то же для всех нитей). Формат записи строк в листбокс следующий: имя нити (это может быть WR1, WR2, RD1, ..., RD4), имя операции (WRITE, READ, WAIT, SLEEP), текущее значение ресурса для операций записи (значение после изменения) и чтения. Вывод должен быть отформатирован (выровнен) для удобства просмотра результатов работы нитей. Ресурс представляет собой строку из 8 символов, которая случайно меняется нитью-писателем. После старта приложения в обработчике сообщения WM_INITDIALOG должны запуститься 6 нитей (thread) - два "писателя" и четыре "читателя". Эти нити должны работать до закрытия диалога. В этих нитях (имеются в виду и "читатель" и "писатель" не должно использоваться никаких message loops и они при своей работе не должны загружать процессор на 100%. При работе этих нитей обязательно должно использоваться одно событие (event) hEventDataReady, которое хранит текущее состояние ресурса. Signaled состояние этого события говорит о том, что ресурс может быть использован для чтения. Нить-читатель не может работать с событием hEventDataReady - не может управлять его состоянием. Это может делать только нить-писатель, указывая нитям-читателям, что ресурс доступен на чтение. Операция записи имеет больший приоритет над операцией чтения (не путать с приоритетами нитей - приоритеты всех нитей, как писателей, так и читателей должны быть одинаковы). Т.е. при начале выполнения операции записи как раз и используется событие hEventDataReady, чтобы остановить последующие операции чтения от выполнения. Это также решает проблему, когда последовательное выполнение оперций чтения не даст возможности выполнить никогда операцию записи. Синхронизация и управление работой всех нитей ДОЛЖНО быть реализовано только с использованием объектов Win32 API, специально для этого предназначенных. Диалог содержит также одну кнопку "Close". По нажатию кнопки "Close" приложение должно корректно закончить работу - т.е. оповестить все потоки об окончании работ и только после ДЕЙСТВИТЕЛЬНОГО окончания всех потоков закончить работу приложения. Окончание работы нити ни в коем случае не может быть выполнено при помощи функии TerminateThread. 2ivank - не расказывай решение, я тебе исходники не для этого выслал |
|
------- Отправлено: 20:24, 12-03-2002 |
Модер Сообщения: 1716
|
Профиль | Сайт | Отправить PM | Цитировать а в чем конкретно проблема-то?
или нет проблемы? |
------- Отправлено: 21:36, 12-03-2002 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
изверг Сообщения: 39
|
Профиль | Сайт | Отправить PM | Цитировать были бы проблемы - сказал, я же предлогаю её для решения - может кому понравиться проблемы, проблемы.... |
------- Отправлено: 18:47, 13-03-2002 | #3 |
mixx
Сообщения: n/a |
|
Отправлено: 10:10, 06-03-2003 | #4 |
Cinik
Сообщения: n/a |
VuDZ, я бы в вашем случае на Рихтера сослался бы, ставя подобную задачу! Это во-первых, а во-вторых, предполагаю, что сослаться также придется и при описании решения подобной задачи! (ничего культурно не сказал о плагиате)...
Даешь исходники народу!!! http://src.fitkursk.ru/detail_book.asp?id=190 -- здесь можно скачать Рихтера на русском языке! Всем желаю удачи! |
|
Отправлено: 17:44, 02-04-2003 | #5 |
Участник сейчас на форуме | Участник вне форума | Автор темы | Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
Задачка по GPO | Lavrentiy | Microsoft Windows NT/2000/2003 | 6 | 28-11-2008 17:55 | |
MSFT SQL Server - Задачка | ValVlaGen | Программирование и базы данных | 6 | 27-08-2008 02:15 | |
Задачка по С++ | kiri | Программирование и базы данных | 1 | 21-06-2006 02:57 | |
Задачка | noname00.pas | Программирование и базы данных | 6 | 07-12-2001 11:43 | |
Задачка... | noname00.pas | Программирование и базы данных | 4 | 28-11-2001 03:17 |
|