Версия для печати темы

Нажмите сюда для просмотра этой темы в обычном формате

Форум «Всё о Паскале» _ Ада и другие языки _ Синхронизация работы процессов в Windows

Автор: Rocket 7.12.2008 1:54

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

Автор: volvo 7.12.2008 2:32

Цитата
какой-нибудь рабочий примерчик тоже сойдёт)
Примерчик из MSDN, кстати, вполне себе рабочий: http://msdn.microsoft.com/en-us/library/ms686946(VS.85).aspx

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

Автор: Rocket 7.12.2008 3:02

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

Примерчик из MSDN, кстати, вполне себе рабочий: http://msdn.microsoft.com/en-us/library/ms686946(VS.85).aspx

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

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

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

Автор: volvo 7.12.2008 14:20

Цитата
А вот как это всё применить для решения конкретной задачи?
Вот так, примерно:
#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 8.12.2008 2:29

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

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

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


Прикрепленные файлы
Прикрепленный файл  event.rar ( 716 байт ) Кол-во скачиваний: 202

Автор: volvo 8.12.2008 3:29

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

Автор: Rocket 8.12.2008 3:35

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

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

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