Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Синхронизация объект события 
:(
    Опции темы
Zevsnet1
Дата 17.10.2011, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 2.10.2011

Репутация: нет
Всего: нет



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

В пансионе отдыхают и предаются размышлениям 5 философов (потоки),
пронумерованные от 1 до 5. В столовой расположен круглый стол, вокруг
которого расставлены 5 стульев, также пронумерованные от 1 до 5. На столе
находится одна большая тарелка со спагетти, которая пополняется бесконечно,
также там расставлены 5 тарелок, в которые накладывается спагетти, и 5 вилок
(разделяемые ресурсы), назначение которых очевидно.
Для того чтобы пообедать, философ входит в столовую и садится на
любой стул. При этом есть философ сможет только в том случае, если
свободны две вилки – справа и слева от его тарелки. При выполнении этого
условия философ поднимает одновременно обе вилки и может поглощать пищу
в течение какого-то заданного времени. В противном случае, философу
приходится ждать освобождения обеих вилок.
Пообедав, философ кладет обе вилки на стол одновременно и уходит.
Описанный процесс происходит бесконечно.
Воспользоваться объектами синхронизации типа «событие».


Логику задания я понял, как что происходит тоже, но как все перевести в жизнь машины не могу понять, уже проэксперементировал  со всем... так эксперементил что в нижнем исходнике столько всего лишнего стало....
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Button2: TButton;
    Button3: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Memo1Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
    max_=4;
var
    Form1     : TForm1;
    idThread    : DWORD;
    h         : array[0..max_] of THandle;//философы
    s1,s2    : DWORD;

    Event1        : array [0..max_] of THandle;//вилки
    state    : array [0..max_] of byte;//состояние
    can_eat    : array [0..max_] of byte;
    forks        : array [0..max_] of byte;
    philos        : array [0..max_] of byte;//философы
    site        : array [0..max_] of byte;
    Pos_styl    : array [0..max_] of byte;
implementation

{$R *.dfm}
const
    Eating   = 0;    // ест
    SitUp = 2;       // встал

procedure pickup(pos:byte);
begin
    if(state[pos]=0)then exit;
    
    if    (state[pos] <> Eating) and 
        (state[(pos+1) mod 5] <> Eating)then
    begin
        state[pos]:= Eating;
        state[(pos+1) mod 5]:=Eating;
    end;
    
    if state[pos] <> Eating then exit;
end;

procedure Up(pos:byte);
begin
    state[pos]:= SitUp;
    state[(pos+1) mod 5]:=SitUp;
end;
procedure Disable_(site1,site2:integer;flag:boolean);
var
  i:byte;
begin
    if(site2 = -1)then site2:=max_;
    if(flag = false)then
  begin
        if(Pos_styl[site1]<> 1)and(Pos_styl[site2]<> 1)then
        begin
            Pos_styl[site1]:=1;
            Pos_styl[site2]:=1;
        end
        else
        begin
            //exit;//???
        end;
  end
    else
    begin
        for i:=0 to max_ do
        begin
            Pos_styl[i]:=0;
        end;
    end;
end;
function philosopher (i:integer):DWORD;stdcall;
var
    pos:byte;
begin
    pos:=random(max_);
    WaitForSingleObject (Event1[pos], INFINITE);
    //WaitForSingleObject (Event1[pos-1], INFINITE);
{
    pickup(pos);
    Sleep(random(5000));
    up(pos);
}
    Sleep(random(5000));
    Disable_(pos,pos-1,false);
    //SetEvent (Event1[pos-1]);
    SetEvent (Event1[pos]);
    philosopher := i;
end;
/////////////////
function whatphilos:boolean;
var
    i:byte;
    flag:boolean;
begin
    flag:=true;
    for i:=0 to max_ do
    begin
        if(site[i]=5)then
        begin
            flag:=false;
        end;
    end;
    whatphilos:=flag;
end;
/////////////////
procedure TForm1.Button2Click(Sender: TObject);

var
    i,j: integer;
    fix: bool;
    counter: integer;

    temp_fil: array [0..max_] of byte;
    flag:boolean;
begin
    randomize;
    fix:=false;
    for j:=0 to max_ do
    begin
        Event1[j] := CreateEvent (nil, FALSE,true, 'Event');
    end;

    
    while (fix=false) do
    begin
        for j:=0 to max_ do
        begin
            temp_fil[j]:=0;
        end;
        for counter:=0 to max_ do
        begin
            flag:=false;
            repeat
                i:=random(5);
                if(i=5)then i:=max_;
                if(temp_fil[i]=0)then 
                begin
                    flag:=true;
                    site[counter]:=i;
                    temp_fil[i]:=1;
                end;
            until flag = true;
            h[counter] := CreateThread (nil, 0, @philosopher, Pointer (i),0, idThread);
            Memo1.Lines.add('Филосов '+IntToStr(i+1)+' пошел');    
        end;
        for j:=0 to max_ do
        begin
            temp_fil[j]:=0;
        end;

        i:=1;
        while(whatphilos = true)do
        begin
            Memo1.Lines.add('--------------------------------------');
            Memo1.Lines.add('Филосов '+IntToStr(site[i]+1)+' кушает');
            if(i<>max_+1)then Memo1.Lines.add('Филосов '+IntToStr(site[i+1]+1)+' кушает');
            
            WaitForSingleObject (h[i], INFINITE);//первый пошел
            if(i<>max_+1)then WaitForSingleObject (h[i+1], INFINITE);//воторой пошел
            
            Disable_(1,2,true);
            
            GetExitCodeThread (h[i], s1);
            if(i<>max_+1)then GetExitCodeThread (h[i+1], s2);
            
            CloseHandle(h[i]);
            if(i<>max_+1)then CloseHandle(h[i+1]);
            
            site[i]:=max_+1;
            if(i<>max_+1)then site[i+1]:=max_+1;
            
            Memo1.Lines.add('Филосов '+IntToStr(s1+1)+' поел');
            if(i<>max_+1)then Memo1.Lines.add('Филосов '+IntToStr(s2+1)+' поел');
            Memo1.Lines.add('--------------------------------------');
            
            i:=i+2;
        end;
        
        {for i:=0 to 4 do
        begin
            Memo1.Lines.add('--------------------------------------');
            Memo1.Lines.add('Филосов '+IntToStr(site[i]+1)+' кушает');
            WaitForSingleObject (h[i], INFINITE);
            
            GetExitCodeThread (h[i], s1);
            Memo1.Lines.add('Филосов '+IntToStr(s1+1)+' поел');
            Memo1.Lines.add('--------------------------------------');
            CloseHandle(h[i]);
        end;}
        
        Sleep(1000);
    end;
    for j:=0 to max_ do
    begin
        CloseHandle (Event1[j]);
    end;
    
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
    form1.close;
end;

procedure TForm1.Memo1Click(Sender: TObject);
begin
    Memo1.Clear;
end;

end.



мой запутанный код, в котором я потерялся.(
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0412 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.