IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Синхронизация работы процессов в Windows, C++
сообщение
Сообщение #1


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Доброго времени суток! Мне нужно реализовать мьютекс, событие и семафор, по заданию. С мьютексом и событием я вроде бы разобрался и выполнил, а вот на семафоре застопорился, на то он и семафор..наверное))
Вообщем, помогите мне пожалуйста с его реализацией!... какой-нибудь рабочий примерчик тоже сойдёт)
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Гость






Цитата
какой-нибудь рабочий примерчик тоже сойдёт)
Примерчик из MSDN, кстати, вполне себе рабочий: Using Semaphore Objects

Можешь еще посмотреть у Рихтера, он тоже показывал, как работать с семафорами...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 6.12.2008 22:32) *

Примерчик из MSDN, кстати, вполне себе рабочий: Using Semaphore Objects

Можешь еще посмотреть у Рихтера, он тоже показывал, как работать с семафорами...

А вот как это всё применить для решения конкретной задачи?
Вот собственно сама задача : на бензозаправке было построено 4 заправочных места. Считая их одинаковыми, подсчитать, какое количество машин вынуждено было проехать мимо, так как все места были заняты. Новая машина подъезжает к заправке через 1-2 мин. Время заправки одной машины – 1-4 мин. Для контроля количества свободных мест на заправке использовать семафор.
Как хотя бы передать основную идею семафора...

Да и что-то пример на MSDN оказался крайне непонятным для меня.

Сообщение отредактировано: Rocket -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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;
}
Ну, подсчет проехавших мимо машин добавишь сам, основная идея должна быть понятна...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 7.12.2008 10:20) *
Вот так, примерно:

Подсчёт добавил - всё отменно работает, спасибо! smile.gif

А вот с событием что-то не получается. Я запускаю два приложения: в одном вывожу сообщение, нажимаю на клавиатуру и после этих действий в другом должна быть выведена другая строка. Но последного не происходит... Вообще само задание формулировалось следующим образом: реализовать два процесса, один из которых дожидается нажатия клавиши (или кнопки на окне) и сообщает об этом другому процессу с помощью события. После того, как второй процесс дождется события, он должен вывести на экран сто разноцветных геометрических фигур...(привел с целью полного ознакомления с заданием )
Помогите довести до ума то, что я начал.

Сообщение отредактировано: volvo -


Прикрепленные файлы
Прикрепленный файл  event.rar ( 716 байт ) Кол-во скачиваний: 104
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


Гость






Цитата
Я запускаю два приложения: в одном вывожу сообщение, нажимаю на клавиатуру и после этих действий в другом должна быть выведена другая строка. Но последного не происходит...
Хм...
Прикрепленное изображение
Что я делаю не так? smile.gif Сначала запустил приложение, создающее Event, потом - приложение, открывающее Event. Все так, как ты и сказал: при нажатии кнопки во втором в окне первого добавляется еще одна строка... Проверяй после OpenEvent, что возвращает GetLastError, возможно, событие не открывается?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Знаток
****

Группа: Пользователи
Сообщений: 306
Пол: Мужской
Реальное имя: Евгений

Репутация: -  0  +


Цитата(volvo @ 7.12.2008 23:29) *

Хм...
Прикрепленное изображение
Что я делаю не так? smile.gif Сначала запустил приложение, создающее Event, потом - приложение, открывающее Event. Все так, как ты и сказал: при нажатии кнопки во втором в окне первого добавляется еще одна строка... Проверяй после OpenEvent, что возвращает GetLastError, возможно, событие не открывается?

Да, действительно всё работает...видимо я сначала запускал приложение, которое открывает Event, а не создаёт его...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 27.10.2020 10:18
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name