Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
65 / 0 / 3
Регистрация: 06.11.2010
Сообщений: 177
1

задача про обедающих философов

18.12.2013, 21:16. Просмотров 1223. Ответов 2
Метки нет (Все метки)


Здравствуйте! Делаю программу про обедающих философов.
http://alice.pnzgu.ru/~dvn/prolog/articls/9.htm
Хочу сделать через картинки. Когда философ голоден - одна картинка, когда ест - другая.
Возник вопрос как менять эти картинки.
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
begin
 
i:=FindNumber; // определяем номер философа и соответствующую ему фигуру на форме
 
//Здесь нужно поменять нужное изображение 
 
EnterCriticalSection(CriticalSection); // входим в критическую область
 
//WaitForSingleObject(mutex,INFINITE); // то же с использованием мьютекса
 
try
state[i]:=phHungry;    // объявляем, что философ голоден и
 
// Здесь замена изображения
 
test(i);               // пытаемся получить палочки
 
finally
LeaveCriticalSection(CriticalSection); // выходим из критической области
Как найти нужное изображение, которое нужно изменить? и как его изменить?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
18.12.2013, 21:16
Ответы с готовыми решениями:

Потоки. Event. Задача про обедающих философов.
Здравствуйте, товарищи. Возник вопрос непонимания, по которому не удалось продолбиться с помощью...

Эмуляция обедающих философов
Доброго времени суток, уважаемые форумчане! Необходима помощь в доработке одной программы... ...

Реальзация задачи обедающих философов с помощью событий
помогите написать реальзацию задачи обедающих философов с помощью событий. не могу понять сколько...

Как можно упростить код для обедающих философов и добавить описание действия для каждого философа?
import java.util.Random; import java.util.concurrent.Semaphore; import...

__________________
Помогаю в написании студенческих работ здесь.
2
723 / 475 / 130
Регистрация: 24.12.2008
Сообщений: 3,924
19.12.2013, 00:42 2
Из этого куска кода ничего непонятно
0
65 / 0 / 3
Регистрация: 06.11.2010
Сообщений: 177
19.12.2013, 01:40  [ТС] 3
Delphi
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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
philosopher.pas
 
unit Philosopher;
interface
uses
  Classes, Windows, Graphics, ExtCtrls,SysUtils;
 
type
 
  Philosophers = class(TThread)
  private
    procedure think;
    procedure eat;
    procedure take_stick;
    procedure put_stick;
    procedure test(i:integer);
    function FindNumber:integer;
  protected
    procedure Execute; override;
  end;
implementation
 
uses Main;
// работа процесса
procedure Philosophers.Execute;
begin
while (not Terminated) do begin // жизненный цикл китайского философа:
take_stick;                 // берет палочки или голодает (блокируется)
eat;                            // ест
put_stick;                  // кладет палочки
think;                        // думает
end;
end;
 
// философ думает
procedure Philosophers.think;
begin
sleep(Random(10000)); // думает не более 10 сек.
end;
// философ пытается взять палочки для еды
procedure Philosophers.take_stick;
var i:integer;
begin
i:=FindNumber; // определяем номер философа и соответствующую ему фигуру
 // [B]Здесь нужно изменить картинку[/B]
 
EnterCriticalSection(CriticalSection); // входим в критическую область
try
state[i]:=phHungry;    // объявляем, что философ голоден и
 // [B]Здесь изменение картинки[/B]
 
test(i);               // пытаемся получить палочки
 
finally
LeaveCriticalSection(CriticalSection); // выходим из критической области
WaitForSingleObject(semaphore[i],INFINITE); // блокируемся на неопределенное
// время, если палочки  не достались. Если в процедуре test философ перешел в
// состояние "ест", соответствующий семафор увеличивается на 1 и блокировки
// не происходит
end;
end;
 
// философ ест
procedure Philosophers.eat;
begin
sleep(Random(5000));  // ест не более 5 сек.
end;
// философ оканчивает еду и предлагает палочки соседям
procedure Philosophers.put_stick;
var i, left, right:integer;
begin
i:=FindNumber;
//[B]Здесь замена изображения[/B]
EnterCriticalSection(CriticalSection); // входим в критическую область
try
state[i]:=phThinking;  // объявляем, что философ думает
//[B]Здесь замена изображения[/B]
left:=i+1;   // определяем его соседей ...
if left=6 then left:=1;
right:=i-1;
if right=0 then right:=5;
test(left);  // и проверяем, может ли есть сосед слева ...
test(right); // или справа
finally
LeaveCriticalSection(CriticalSection); // выходим из критической области
end;
end;
// процедура проверки доступности палочек для еды
procedure Philosophers.test(i:integer);
var left, right:integer;
begin
left:=i+1; // определяем соседей
if left=6 then left:=1;
right:=i-1;
if right=0 then right:=5;
// если философ голоден, а палочки свободны (соседи справа и слева не едят) ...
if (state[i]=phHungry) and (state[left]<>phEating) and (state[right]<>phEating)
  then begin state[i]:=phEating; // объявляем, что философ ест
             [B]//Здесь замена[/B]
 
             ReleaseSemaphore(semaphore[i],1,nil); // увеличиваем счетчик
 
             // сщщтветствующего философу семафора на единицу
 
       end;
 
end;
 
// дополнительная функция, позволяющая определить номер философа по
 
// идентификатору потока.
 
function Philosophers.FindNumber:integer;
 
var i:integer;
 
begin
 
for i:=1 to 5 do
 
   if PHID[i]=ThreadID then begin FindNumber:=i; break; end;
 
end;
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
19.12.2013, 01:40

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь или здесь.

Задача об обедающих философах
Доброго времени суток! Поиском пользовался, но ответа для себя не нашёл, поэтому создаю тему. ...

Задача об обедающих философах
Тема заезженная,но все таки. Интересует решение задачи &quot;Обедающих философов&quot;. Мне надо сделать...

Многопоточность: задача об обедающих философах
Доброго времени суток! Нужно перевести код с С++ с использованием библиотеки &lt;thread&gt; и &lt;mutex&gt; на...

Многопоточность, задача об обедающих философах (семафоры)
#include &quot;iostream&quot; #include &quot;string&quot; #include &quot;windows.h&quot; #include &quot;process.h&quot; #include...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.