Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
8 / 8 / 2
Регистрация: 31.10.2008
Сообщений: 41
1

Многопоточная программа, демонстрирующая работу лифтов

20.05.2009, 07:05. Показов 1574. Ответов 0
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте! Надо было сделать курсовой, но как обычно оставил все на последний момент. У старшекурсников нашел прогу, почти как в моем задании. Собственно задание: Два лифта в различных концах здания обслуживают 6 этажей. Фиксированное число N потенциальных пассажиров двигаются независимо друг от друга по этажам или временно уходят из здания на первом этаже. Через случайное время пассажир подходит к одному из лифтов, где он раньше вышел из него, и дожидается появления лифта, ожидая, если оказывается необходимым, в очереди, и входит в лифт для подъема или спуска на случайно выбранный этаж. Грузоподъемность лифта 3 человека. После выхода из лифта пассажиры с различной скоростью движутся по этажу. Перед началом работы программы вводится число N. Поведение модели отображается на экране в текстовом режиме. Поведение пассажиров имитируется с помощью отдельных нитей. Для правильного взаимодействия используются семафоры.
Но программа эта работает только с 1 лифтом и 4 этажами. Помогите переписать под мое задание
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
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <process.h>
 
HANDLE sem_lift,sem_in_lift,sem_out_lift;
int n[4];
 
//Display date
void display()
{
    textcolor(15);
   gotoxy(17,21); cprintf("   ");
   gotoxy(17,22); cprintf("   ");
   gotoxy(17,23); cprintf("   ");
   gotoxy(17,21); cprintf("%d",n[1]);
   gotoxy(17,22); cprintf("%d",n[2]);
   gotoxy(17,23); cprintf("%d",n[0]);
}
 
//Out Lift Hread
DWORD WINAPI out_lift(void *etag)
{
    int tx, ty, txp ,et;
   et=(int)etag;
   switch (et)
   {
      case 2  : ty=15; txp=16; break;
      case 3  : ty=11; txp=8; break;
         case 4  : ty=7;  txp=0; break;
   }
   display();
    for (tx=10; tx<=45; tx++)
   {
           if ((tx>=(15+txp)) & (tx <= 37) & ((tx % 2) !=0 )) ty++;
         if (((et==2)&(tx!=27)&(tx!=28)) || ((et==3)&(tx!=19)&(tx!=20)) || (et==4))
         {
              textcolor(12);
               gotoxy(tx,ty); cprintf("O");
              Sleep((rand()%3)*50+100);
              gotoxy(tx,ty); cprintf(" ");
         }
    }
   n[0]++;
   display();
   return(0);
}
 
 
 
void ar(int action)
{
    DWORD out_lift_id;
    HANDLE out_lift_h;
    int nx, no[1];
// ReleaseSemaphore(sem_in_lift,0,NULL);
// ReleaseSemaphore(sem_out_lift,0,NULL);
// ReleaseSemaphore(sem_lift,0,NULL);
   if ((n[3]==2)&(action==1)) n[3]=0;
   if (((action==0)||(action==1))&(n[3]==0)&(n[1]>0))
   {
       if (n[1]>=3) nx=3;
      else nx=n[1];
      n[1]-=nx; n[2]+=nx;
         n[3]=1;
   }
    if ((action>=2)&(action<=4)&(n[3]==1))
   {
          if (action==4) nx=n[2]; else
      if (n[2]>0) nx=rand()%(n[2]+1);
      n[2]-=nx;
      if (n[2]==0) n[3]=3;
        CreateThread(NULL,4096,out_lift,(void*)action,0,&out_lift_id);
   }
   if ((n[3]==3)&(n[1]>0)) n[3]=2;
    display();
}
 
 
 
//In Lift
DWORD WINAPI in_lift(void *speed)
{
    int tx, nx;
      if (n[0]>=2) nx=((rand()%2)+1);
   else if (n[0]==1) nx=1;
   n[0]-=nx;
   display();
    for (tx=45; tx>=10; tx--)
   {
       if ((tx!=35)&(tx!=36))
        {
          textcolor(12);
           gotoxy(tx,19); cprintf("%d",nx);
          Sleep(((int)speed*40) + 90);
          gotoxy(tx,19); cprintf(" ");
      }
    }
   n[1]+=nx;
   ar(0);
   display();
   return(0);
}
 
 
 
//Lift
DWORD WINAPI lift(void *arg)
{
    int ty=19;
   (int)arg;
   while(1)
   {
      textcolor(14);
      gotoxy(6,ty-2); cprintf(" _ ");
       gotoxy(6,ty-1); cprintf("| |");
       gotoxy(6,ty); cprintf("|_|");
//        WaitForSingleObject(sem_lift,INFINITE);
      switch (ty) {case 19 : ar(1); Sleep(200); break;
                   case 15 : ar(2); Sleep(200); break;
                       case 11 : ar(3); Sleep(200); break;
                   case 7  : ar(4); Sleep(200); break;}
      Sleep(500);
      gotoxy(6,ty-2); cprintf("   ");
       gotoxy(6,ty-1); cprintf("   ");
       gotoxy(6,ty); cprintf("   ");
      if (n[3]==1) ty--;
      if (n[3]==2) ty++;
   }
   return(0);
}
 
 
void main()
{
   int i, ty, tx=15;
   DWORD in_lift_id, lift_id;
   HANDLE in_lift_h, lift_h;
   sem_lift=CreateSemaphore(NULL,0,1,NULL);
   sem_in_lift=CreateSemaphore(NULL,0,1,NULL);
   sem_out_lift=CreateSemaphore(NULL,0,1,NULL);
    clrscr();
    for (i=0; i<=3; i++) n[i]=0;
   gotoxy(5,5); textcolor(15); cprintf("Input potencial: "); cscanf("%d",&n[0]);
   clrscr();
   textcolor(11);
   for (ty=5; ty<=19; ty++)
   {
      gotoxy(5,ty); cprintf("|   |");
      if (ty==8 || ty==12 || ty==16) {gotoxy(10,ty);cprintf("-----");}
      if (ty==12 || ty==16)          {gotoxy(15,ty);cprintf("------");}
      if (ty==16)                    {gotoxy(21,ty);cprintf("--------");}
      if ((ty>=9)&(ty<=19))
       {
          gotoxy(tx,ty);cprintf("--");
         tx+=2;
      }
   }
    gotoxy(5,20);cprintf("----------------------------------------");
 
      textcolor(15);
   gotoxy(5,21); cprintf("Wait lift:");
   gotoxy(5,22); cprintf("In Lift:");
   gotoxy(5,23); cprintf("Potencial:");
   display();
    CreateThread(NULL,4096,lift,(void*)(rand()%3),0,&lift_id);
    while(1)
   {
      Sleep(1500*(rand()%6 +4));
        if (n[0]>0) CreateThread(NULL,4096,in_lift,(void*)(rand()%3),0,&in_lift_id);
   }
   getchar();
   CloseHandle(in_lift_h);
   CloseHandle(lift_h);
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
20.05.2009, 07:05
Ответы с готовыми решениями:

Продемонстировать работу с потоками на примере двух лифтов
Задание: необходимо сымитировать 2 потока. Суть 2 лифта, которые двигаются в рандомном положение...

Программа, демонстрирующая различие между классами-обертками и примитивными типами.
Добрый день! Очень нужна ваша помощь. Дело обстоит так: в универе начали изучать Java, одной из...

Многопоточная программа
Уже 2 сутки не могу понять как сделать. Подскажите Вызываю поток procedure...

многопоточная программа
есть вот такая программа-при нажатии символа, добавляет его справа(1-ая операция); при нажатии...

0
20.05.2009, 07:05
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
20.05.2009, 07:05
Помогаю со студенческими работами здесь

Не работает многопоточная программа (С++)
Всем привет! Сегодня решил создать многопоточное приложение, и столкнулся с проблемой: ...

Зависает многопоточная программа
Так не работает, точнее работает, но уходит в молчание, кнопки не кликабельны. private void...

В чем я ошибся? (Многопоточная программа)
Написать программу, которая принимает в качестве параметров набор имен файлов данных (произвольное...

Многопоточная программа работает через раз.
Доброго времени суток, друзья. Только начал изучать написание многопоточных программ. Использую...

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

Многопоточная программа выполняется медленнее чем однопоточная
Программа должна создать один поток исполнения для каждого файла и использовать эти потоки для...


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

Или воспользуйтесь поиском по форуму:
1
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru