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

> Внимание!

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

> Синхронизация работы процессов в Windows, C++
Rocket
сообщение 6.12.2008 21:54
Сообщение #1


Знаток
****

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

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


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


Гость






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

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


Знаток
****

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

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


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

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

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

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

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

Сообщение отредактировано: Rocket - 7.12.2008 1:11
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 7.12.2008 10:20
Сообщение #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
сообщение 7.12.2008 22:29
Сообщение #5


Знаток
****

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

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


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

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

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

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


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


Гость






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


Знаток
****

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

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


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

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

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

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

 

- Текстовая версия 27.07.2025 21:55
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"