Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 25.12.2012, 20:52   #1
drozd_amm
Новичок
Джуниор
 
Регистрация: 25.12.2012
Сообщений: 1
По умолчанию delphi потоки, компилируется и вылетает.

условие: имеется 7 остановок, 2 маршрутных такси, двигающиеся в противоположных направлениях. на каждую остановку через случайные промежутки времени приходит случайное количество человек, каждый человек - объект, имеющий номер своих отправной и конечной остановок. Каждое маршрутное такси имеет вместимость 15 человек. Реализовать модель работы маршрутного такси.

в коде что я написал есть пока что только одна маршрутка

Код:
program cppo;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  Windows,
  Classes;

type
  info = record
          _ot:Integer;
          _do:integer;
          empty:Boolean;
         end;
   TQueue=^Elem;
    Elem=record
    exatdo:integer;
    head,tail,next:TQueue;
    end;

TNewThread = class(TThread)
    procedure Execute; override;
  end;

var
p: array[1..20] of TNewThread;
bd: array[1..7] of TQueue;

m1,m2: array [1..15] of info;
i,j,h,g,m1h,m1g,m2h,m2g,m1empty,m2empty:Integer;
hSem: THandle;


procedure PushQueue(n,_do:integer);
var p:TQueue;
begin
new(p);
p^.next:=nil;
p^.exatdo:=_do;
if bd[n]^.tail=nil then bd[n]^.head:=p
else bd[n]^.tail^.next:=p;
end;

procedure TNewThread.Execute;
var i,x,y:Integer;
WaitReturn: DWORD;
begin
while not terminated do
 begin
  WaitReturn := WaitForSingleObject(hSem, INFINITE);
  if WaitReturn = WAIT_OBJECT_0 then
   begin
    x:=Random(7);
    y:=Random(7);
    for i:=1 to 7 do
     if x=i then PushQueue(i,y);
   end;
  ReleaseSemaphore(hSem, 1, nil);
 end;
end;

function PopQueue(n:integer):integer;
var p:TQueue;
begin
   p:=bd[n]^.head;
   bd[n]^.head:=p^.next;
   if bd[n]^.head=nil then bd[n]^.tail:=nil;
   PopQueue:= p^.exatdo;
   p:=nil;
   dispose(p);
end;

BEGIN
  hSem := CreateSemaphore(nil, 1, 1, nil);
  for g:=1 to 7 do
   begin
  //  bd[g]^.head:=nil;
    bd[g]^.tail:=nil;
  end;
  for j:=1 to 2 do
    p[j]:=TNewThread.Create(false);
  m1empty:=15;
  m2empty:=15;
  for h:=1 to 15 do
   begin
     m1[h].empty:=true;
     m2[h].empty:=true;
   end;

  for i:=1 to 7 do
   begin
     Writeln('на остановке ',i,':');
     if m1empty < 15 then
     begin
      if m1empty=14 then Write('из маршрутки номер 1  вышел пассажир ')
       else writeln ('из маршрутки номер 1  вышли пассажиры:');
     for m1g:=1 to 15 do
      if  m1[m1g]._do = i then
        begin
          Inc(m1empty);
          m1[m1g].empty:=true;
          Writeln('следовавший от ',m1[m1g]._ot,' остановки');
        end;
     end;
     while (bd[i]^.tail<>nil) and (m1empty>1) do
        if bd[i]^.exatdo > i then
        begin
         Dec(m1empty);
         for m1h:=1 to 15 do
         if m1[m1h].empty=true
          then begin
                 m1[m1h]._do:=PopQueue(i);
                 m1[m1h]._ot:=i;
                 m1[m1h].empty:=False;
                 writeln(' в маршрутку номер 1 сел пассажир следующий до ',m1[m1h]._do,' остановки');
               end;
        end;


   end;
   for i:=1 to 10 do p[i].terminate;
   Readln;
END.
drozd_amm вне форума Ответить с цитированием
Старый 25.12.2012, 21:46   #2
eoln
Старожил
 
Аватар для eoln
 
Регистрация: 26.04.2008
Сообщений: 2,645
По умолчанию

Для этого есть отладчик (F7/F8 - пошаговое выполнение программы). Первое что показал отладчик это
Код:
  for g:=1 to 7 do
   begin
  //  bd[g]^.head:=nil;
    bd[g]^.tail:=nil;
  end;
bd[g]^ -по этому адресу ещё нет объекта, память не выделена. Дальше не смотрел.

Сразу что не понравилось так это то, что PopQueue/PushQueue могут одновременно выполяться в главном и дочернем потоках, что чревато фатальной ошибкой.
eoln вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Delphi 7 Приложение калькулятор Не компилируется! tatarcenocek Помощь студентам 6 05.02.2012 18:35
Delphi.Потоки D1mon Фриланс 1 27.11.2011 19:16
Потоки в Delphi ChEaTeR-abc Помощь студентам 3 14.07.2010 17:40
Не компилируется в FreePascal, зато в Delphi работает! k1r1ch Общие вопросы Delphi 4 02.11.2009 16:37
delphi. Не компилируется! dimple Помощь студентам 2 30.04.2008 11:00