Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для MeteoR174
0 / 0 / 0
Регистрация: 24.11.2016
Сообщений: 33

Задача о "спящем парикмахере"

18.12.2018, 13:52. Показов 2154. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется вот такой код, он рабочий задачу выполняет.
Есть вопрос к этой конструкции, что здесь происходит? Есть ли в этом ошибка?
C++
1
2
3
4
5
6
7
8
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
        Barber *barber = new Barber(true);
        barber->Priority = tpTimeCritical;
        barber->Resume();
        //Почему здесь запускается поток и сразу завершается?
        barber->Terminate();
}
Основной код
Unit1
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
HANDLE ghMutex;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
        Timer1->Enabled=false;
 
        ghMutex = CreateMutex(
                NULL,
                FALSE,
                NULL);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Button1Click(TObject *Sender)
{
        Label2->Caption="Êëèåíò ñåë íà ñòóë â ïðèåìíîé";
        DWORD result;
        result = WaitForSingleObject(ghMutex, 0);
        while(1)
        {
                if (result==WAIT_OBJECT_0)
                break;
        }
        Timer1->Enabled=true;
        if(CheckBox5->State==false)
        {
                CheckBox5->State=true;
                Label2->Caption="Êëèåíò íà ñòðèæêå";
        }
        else if(CheckBox1->State==false)CheckBox1->State=true;
        else if(CheckBox2->State==false)CheckBox2->State=true;
        else if(CheckBox3->State==false)CheckBox3->State=true;
        else if(CheckBox4->State==false)CheckBox4->State=true;
        else Label2->Caption="Ìåñò íåò, êëèåíò óøåë";
 
        ReleaseMutex(ghMutex);
}
//---------------------------------------------------------------------------
 
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
        Barber *barber = new Barber(true);
        barber->Priority = tpTimeCritical;
        barber->Resume();
        barber->Terminate();
}
//---------------------------------------------------------------------------
Unit2
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
//---------------------------------------------------------------------------
 
#include <vcl.h>
#pragma hdrstop
 
#include "Unit2.h"
#include "Unit1.h"
#pragma package(smart_init)
 
extern HANDLE ghMutex;
extern TCheckBox CheckBox5;
extern TCheckBox CheckBox1;
extern TCheckBox CheckBox2;
extern TCheckBox CheckBox3;
extern TCheckBox CheckBox4;
extern TLabel Label2;
__fastcall Barber::Barber(bool NewSuspended): TThread(NewSuspended)
{
Execute();
}
//---------------------------------------------------------------------------
void Barber::SetInfo()
{
        THREADNAME_INFO info;
        info.dwType = 0x1000;
        info.szName = "Barber";
        info.dwThreadID = -1;
        info.dwFlags = 0;
 
        __try
        {
                RaiseException( 0x406D1388, 0, sizeof(info)/sizeof(DWORD),(DWORD*)&info );
        }
        __except (EXCEPTION_CONTINUE_EXECUTION)
        {
        }
}
//---------------------------------------------------------------------------
void __fastcall Barber::Execute()
{
        SetInfo();
        DWORD result;
        result = WaitForSingleObject(ghMutex, 0);
         while(1)
        {
                if (result==WAIT_OBJECT_0)
                break;
        }
                Form1->CheckBox5->State=false;
                Form1->Label2->Caption="Êëèåíò óøåë èç ïàðèêìàõåðñêîé";
                if(Form1->CheckBox1->State)
                {
                        Form1->CheckBox1->State=false;
                        Form1->CheckBox5->State=true;
                        Form1->Label2->Caption="Êëèåíò íà ñòðèæêå";
                }
                //äâèæåíèå î÷åðåäè
                if(Form1->CheckBox2->State)
                {
                        Form1->CheckBox2->State=false;
                        Form1->CheckBox1->State=true;
                }
                if(Form1->CheckBox3->State)
                {
                        Form1->CheckBox3->State=false;
                        Form1->CheckBox2->State=true;
                }
                if(Form1->CheckBox4->State)
                {
                        Form1->CheckBox4->State=false;
                        Form1->CheckBox3->State=true;
                }
                if(!Form1->CheckBox5->State) Form1->Timer1->Enabled=false;
        ReleaseMutex(ghMutex);
}
//---------------------------------------------------------------------------
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.12.2018, 13:52
Ответы с готовыми решениями:

Задача о спящем парикмахере, посетителях и свободных стульях (готовый код)
#include&lt;windows.h&gt; //--------------------------------------------------------------------------- int yshed = 0; ...

Задача о спящем парикмахере, посетителях и свободных стульях
В парикмахерской расположено единственное кресло, на котором спит парикмахер, и несколько стульев для клиентов. Когда клиент приходит в...

Задача о спящем брадобрее. Операционные системы
Не могу разобраться, почему программа висит, если количество посетителей переваливает количество мест. Может кто-то что-то подсказать? ...

1
11 / 10 / 1
Регистрация: 16.09.2016
Сообщений: 87
18.12.2018, 16:28
Функция WaitForSingleObject со вторым параметром, который равен 0, сразу возвращает управление и result = WAIT_OBJECT_0. Думаю по этому.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.12.2018, 16:28
Помогаю со студенческими работами здесь

В спящем режиме возобновляется работа
Здравствуйте! Возникла такая проблема: перевожу ноутбук в спящий режим (просто закрываю) а ночью он сам по себе возобновляет работу и так...

Работающий компьютер в спящем режиме
После перехода в спящий режим почти всегда компьютер продолжает гудеть, и, по-видимому работать (светодиод питания в таких случаях...

Ноутбук выключается в спящем режиме
Всем доброго дня! Ноутбук Dell 7390, лицензионная Win 10 В техподдержке заменили материнскую плату. Появилась проблема в спящем...

Частота процессора в спящем режиме.
Такой вопросик. У меня (ну это вообще стандартное поведение) если на процессор нет нагрузки, то он снижает тактовую частоту (за щёт...

В спящем режиме останавливаются таймеры
Использую такой код: class TimerTaskLoad extends TimerTask { @Override public void run() { ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Новые блоги и статьи
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru