![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() |
Rocket |
![]()
Сообщение
#1
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Доброго времени суток! Мне нужно реализовать мьютекс, событие и семафор, по заданию. С мьютексом и событием я вроде бы разобрался и выполнил, а вот на семафоре застопорился, на то он и семафор..наверное))
Вообщем, помогите мне пожалуйста с его реализацией!... какой-нибудь рабочий примерчик тоже сойдёт) |
![]() ![]() |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата какой-нибудь рабочий примерчик тоже сойдёт) Примерчик из MSDN, кстати, вполне себе рабочий: Using Semaphore ObjectsМожешь еще посмотреть у Рихтера, он тоже показывал, как работать с семафорами... |
Rocket |
![]()
Сообщение
#3
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Примерчик из MSDN, кстати, вполне себе рабочий: Using Semaphore Objects Можешь еще посмотреть у Рихтера, он тоже показывал, как работать с семафорами... А вот как это всё применить для решения конкретной задачи? Вот собственно сама задача : на бензозаправке было построено 4 заправочных места. Считая их одинаковыми, подсчитать, какое количество машин вынуждено было проехать мимо, так как все места были заняты. Новая машина подъезжает к заправке через 1-2 мин. Время заправки одной машины – 1-4 мин. Для контроля количества свободных мест на заправке использовать семафор. Как хотя бы передать основную идею семафора... Да и что-то пример на MSDN оказался крайне непонятным для меня. Сообщение отредактировано: Rocket - 7.12.2008 1:11 |
volvo |
![]()
Сообщение
#4
|
Гость ![]() |
Цитата А вот как это всё применить для решения конкретной задачи? Вот так, примерно:#include <iostream>
#include <windows.h>
using namespace std;
LONG maxPlaces = 4;
const int maxCars = 50;
HANDLE hSemaphore;
HANDLE carHandles[maxCars];
int carIDs[maxCars];
DWORD CarThread(int *p)
{
char s[256] = {0};
sprintf(s, "Car #%d test...\n", *p);
cout << s;
// Проверяем состояние семафора
DWORD dwResult = WaitForSingleObject(hSemaphore, 0L);
switch(dwResult) {
case WAIT_OBJECT_0:
// Место есть, заправляемся
sprintf(s, "Car #%d is fuelling...\n", *p);
cout << s;
DWORD fuel_time = (rand() % 3000) + 1000; // Время заправки
Sleep(fuel_time);
ReleaseSemaphore(hSemaphore, 1, NULL); // Освободим семафор
break;
case WAIT_TIMEOUT:
// Семафор занят, проезжаем мимо ...
sprintf(s, "Car #%d: no empty places...\n", *p);
cout << s;
break;
}
return 0;
}
int main()
{
// Инициализируем ГСЧ
srand(time(NULL));
if(hSemaphore = CreateSemaphore(NULL, maxPlaces, maxPlaces, NULL)) {
for(int i = 0; i < maxCars; i++) {
carIDs[i] = i+1;
carHandles[i] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)CarThread,
&carIDs[i], 0, NULL);
DWORD wait_time = 200; // (rand() % 1000) + 1000;
Sleep(wait_time);
}
// Ждем завершения всех тредов ...
WaitForMultipleObjects(maxCars, carHandles, TRUE, INFINITE);
// ... и только потом удаляем семафор
CloseHandle(hSemaphore);
}
// Создать семафор не удалось
else cout << "Cannot create semaphore" << endl;
return 0;
}
Ну, подсчет проехавших мимо машин добавишь сам, основная идея должна быть понятна... |
Rocket |
![]()
Сообщение
#5
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Вот так, примерно: Подсчёт добавил - всё отменно работает, спасибо! ![]() А вот с событием что-то не получается. Я запускаю два приложения: в одном вывожу сообщение, нажимаю на клавиатуру и после этих действий в другом должна быть выведена другая строка. Но последного не происходит... Вообще само задание формулировалось следующим образом: реализовать два процесса, один из которых дожидается нажатия клавиши (или кнопки на окне) и сообщает об этом другому процессу с помощью события. После того, как второй процесс дождется события, он должен вывести на экран сто разноцветных геометрических фигур...(привел с целью полного ознакомления с заданием ) Помогите довести до ума то, что я начал. Сообщение отредактировано: volvo - 14.01.2009 0:31 Прикрепленные файлы ![]() |
volvo |
![]()
Сообщение
#6
|
Гость ![]() |
Цитата Я запускаю два приложения: в одном вывожу сообщение, нажимаю на клавиатуру и после этих действий в другом должна быть выведена другая строка. Но последного не происходит... Хм...![]() Что я делаю не так? ![]() |
Rocket |
![]()
Сообщение
#7
|
![]() Знаток ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 306 Пол: Мужской Реальное имя: Евгений Репутация: ![]() ![]() ![]() |
Хм... ![]() Что я делаю не так? ![]() Да, действительно всё работает...видимо я сначала запускал приложение, которое открывает Event, а не создаёт его... |
![]() ![]() |
![]() |
Текстовая версия | 27.07.2025 21:55 |