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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 10.04.2014, 14:33   #1
a1t2m3
Новичок
Джуниор
 
Регистрация: 10.04.2014
Сообщений: 7
По умолчанию Написать программу, в которой два потока заполняют таблицу умножения

Написать программу, в которой два потока заполняют таблицу умножения (для чисел от 1 до 9). При вычислении использовать только операции сложения. Сумму накапливать в самом массиве. Первый поток заполняет все нечетные строки, второй – все четные. Использовать глобальную переменную для хранения текущего индекса в строке. Использовать семафоры.
a1t2m3 вне форума Ответить с цитированием
Старый 10.04.2014, 14:44   #2
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

или мьютексы, или критические секции, или какие нибудь свои объекты синхронизации. Какие наработки?
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 10.04.2014, 14:47   #3
a1t2m3
Новичок
Джуниор
 
Регистрация: 10.04.2014
Сообщений: 7
По умолчанию

[CODE]unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, TeEngine, Series, TeeProcs, Chart, Buttons;

type
TForm1 = class(TForm)
RadioGroup1: TRadioGroup;
RadioGroup2: TRadioGroup;
btn1: TButton;
procedure btn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Matrix : array [1..9, 1.. 9] of integer;
Handles : array [0..1] of THandle;
ThreadID1, ThreadID2 : Cardinal;
i : integer;
hSemaphore : THandle = 0;

implementation

{$R *.dfm}

procedure FirstHandle;
var j, k, Sum : integer;
WaitReturn : DWORD;
begin
for i := 1 to 9 do
begin
WaitReturn := WaitForSingleObject(hSemaphore, INFINITE);
if WaitReturn = WAIT_OBJECT_0 then
begin
if i mod 2 <> 0 then
for j := 1 to 9 do
begin
Sum := 0;
for k := 1 to j do
begin
Sum := Sum + i;
Sleep(1);
Matrix[i, j] := Sum;
end;
write(Matrix[i,j] : 3);
end;
writeln;
end;
ReleaseSemaphore(hSemaphore, 1, nil);
end;
end;

procedure SecondHandle;
var j, k, Sum : integer;
WaitReturn : DWORD;
begin
for i := 1 to 9 do
begin
WaitReturn := WaitForSingleObject(hSemaphore, INFINITE);
if WaitReturn = WAIT_OBJECT_0 then
begin
if i mod 2 = 0 then
for j := 1 to 9 do
begin
Sum := 0;
for k := 1 to j do
begin
Sum := Sum + i;
Sleep(1);
Matrix[i, j] := Sum;
end;
write(Matrix[i,j] : 3);
end;
writeln;
end;
ReleaseSemaphore(hSemaphore, 1, nil);
end;
end;

procedure TForm1.btn1Click(Sender: TObject);
var i, j : integer;
Reason : DWORD;
begin
hSemaphore := CreateSemaphore(nil, 1, 1, nil);
Handles[0] := CreateThread(nil, 0, @FirstHandle, nil, CREATE_SUSPENDED, ThreadID1);
Handles[1] := CreateThread(nil, 0, @SecondHandle, nil, CREATE_SUSPENDED, ThreadID2);
case RadioGroup1.ItemIndex of
0 : SetThreadPriority(Handles[0], Thread_Priority_Time_Critical);
1 : SetThreadPriority(Handles[0], Thread_Priority_Highest);
2 : SetThreadPriority(Handles[0], Thread_Priority_Above_Normal);
3 : SetThreadPriority(Handles[0], Thread_Priority_Normal);
4 : SetThreadPriority(Handles[0], Thread_Priority_Below_Normal);
5 : SetThreadPriority(Handles[0], Thread_Priority_Idle);
end;
case RadioGroup2.ItemIndex of
0 : SetThreadPriority(Handles[1], Thread_Priority_Time_Critical);
1 : SetThreadPriority(Handles[1], Thread_Priority_Highest);
2 : SetThreadPriority(Handles[1], Thread_Priority_Above_Normal);
3 : SetThreadPriority(Handles[1]%2

Последний раз редактировалось Stilet; 11.04.2014 в 20:57.
a1t2m3 вне форума Ответить с цитированием
Старый 10.04.2014, 14:51   #4
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Почему не работает? Где компилятор или отладчик показывает ошибку?
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 10.04.2014, 14:53   #5
a1t2m3
Новичок
Джуниор
 
Регистрация: 10.04.2014
Сообщений: 7
По умолчанию

в процедуре procedure FirstHandle;
строка write(Matrix[i,j] : 3);
a1t2m3 вне форума Ответить с цитированием
Старый 10.04.2014, 15:14   #6
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Что такое процедуры write и writeln?
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 10.04.2014, 15:18   #7
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Конечно не работает.
http://www.programmersforum.ru/showthread.php?t=181606
Цитата:
все, что удалось написать
А что вы написали-то. Я вижу, что вы только удалили
Код:
procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  Form1.Close;
end;
Sibedir вне форума Ответить с цитированием
Старый 10.04.2014, 15:53   #8
Krok27
Форумчанин
 
Аватар для Krok27
 
Регистрация: 08.07.2010
Сообщений: 505
По умолчанию

Видимо у ТС пропал интерес к теме, все так сложно и не работает. Не работает из за
write ,writeln и глобальной переменной i.
Знающий не говорит, говорящий не знает (С) Лао Цзы
Krok27 вне форума Ответить с цитированием
Старый 11.04.2014, 19:25   #9
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Помогайте, друзья
Вариант 1
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TFooThread = class(TThread)
  private
    FBeginRow: Integer;
  public
    constructor Create (ABeginRow: Integer);
    procedure Execute; override;
  end;

var
  Form1: TForm1;

implementation

var
  Arr: array [1..9,1..9] of Integer;
  Sem: THandle;
  CurCol: Integer;

{ TFooThread }

constructor TFooThread.Create (ABeginRow: Integer);
begin
  inherited Create (False);
  FBeginRow := ABeginRow;
  FreeOnTerminate := True;
end;

procedure TFooThread.Execute;
var
  r, i: Integer;
begin
  while (not Terminated) and (CurCol < 10) do begin
    WaitForSingleObject (Sem, INFINITE);
    r := FBeginRow;
    if FBeginRow = 2 then
      Beep;
    while r < 10 do begin
      Arr [CurCol,r] := 0;
      for i := 1 to CurCol do
        Arr [CurCol,r] := Arr [CurCol,r] + r;
      Inc(r,2);
    end;
    ReleaseSemaphore (Sem, 1, nil)
  end;
end;


{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := 1 to 9 do begin
    StringGrid1.Cells [i,0] := IntToStr(i);
    StringGrid1.Cells [0,i] := IntToStr(i);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  c, r: Integer;
  T1, T2: TFooThread;
begin
  Form1.Enabled := False;
  for c := 1 to 9 do
    for r := 1 to 9 do begin
      StringGrid1.Cells [c,r] := '';
      Arr [c,r] := -1;
    end;

  Sem := CreateSemaphore (nil, 0, 2, nil);

  T1 := TFooThread.Create (1);
  T2 := TFooThread.Create (2);

  CurCol := 0;
  while CurCol < 9 do begin
    Inc (CurCol);
    ReleaseSemaphore (Sem, 2, nil);

    Sleep(30);
    WaitForSingleObject(Sem,INFINITE);
    WaitForSingleObject(Sem,INFINITE);

    for r := 1 to 9 do
      StringGrid1.Cells [CurCol,r] := IntToStr (Arr[CurCol,r]);
    Application.ProcessMessages;
  end;

  CurCol := 10;

  CloseHandle (Sem);

  Form1.Enabled := True;
end;

end.
То правильно заполняет, то нет
Sibedir вне форума Ответить с цитированием
Старый 11.04.2014, 19:26   #10
Sibedir
Тот ещё
Старожил
 
Аватар для Sibedir
 
Регистрация: 14.11.2007
Сообщений: 2,242
По умолчанию

Вариант 2
Код:
unit Unit1;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    StringGrid1: TStringGrid;
    Button1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TFooThread = class(TThread)
  private
    FBeginRow: Integer;
    FSem: THandle;
  public
    constructor Create (ABeginRow: Integer; ASem: THandle);
    procedure Execute; override;
  end;

var
  Form1: TForm1;

implementation

var
  Arr: array [1..9,1..9] of Integer;
  Sem_Main: THandle;
  CurCol: Integer;

{ TFooThread }

constructor TFooThread.Create (ABeginRow: Integer; ASem: THandle);
begin
  inherited Create (False);
  FBeginRow := ABeginRow;
  FSem := ASem;
  FreeOnTerminate := True;
end;

procedure TFooThread.Execute;
var
  r, i: Integer;
begin
  while (not Terminated) and (CurCol < 10) do begin
    WaitForSingleObject (Sem_Main, INFINITE);
    r := FBeginRow;
    while r < 10 do begin
      Arr [CurCol,r] := 0;
      for i := 1 to CurCol do
        Arr [CurCol,r] := Arr [CurCol,r] + r;
      Inc(r,2);
    end;
    ReleaseSemaphore (FSem, 1, nil)
  end;
end;


{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
var
  i: Integer;
begin
  for i := 1 to 9 do begin
    StringGrid1.Cells [i,0] := IntToStr(i);
    StringGrid1.Cells [0,i] := IntToStr(i);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  c, r: Integer;
  ST1, ST2: THandle;
  T1, T2: TFooThread;
begin
  Form1.Enabled := False;
  for c := 1 to 9 do
    for r := 1 to 9 do begin
      StringGrid1.Cells [c,r] := '';
      Arr [c,r] := -1;
    end;

  Sem_Main := CreateSemaphore (nil, 0, 2, nil);
  ST1 := CreateSemaphore (nil, 0, 1, nil);
  ST2 := CreateSemaphore (nil, 0, 1, nil);

  CurCol := 1;
  T1 := TFooThread.Create (2, ST2);
  T2 := TFooThread.Create (1, ST1);

  while CurCol < 10 do begin
    ReleaseSemaphore (Sem_Main, 2, nil);

    WaitForSingleObject(ST1,INFINITE);
    WaitForSingleObject(ST2,INFINITE);

    for r := 1 to 9 do
      StringGrid1.Cells [CurCol,r] := IntToStr (Arr[CurCol,r]);
    Application.ProcessMessages;
    Inc (CurCol);
  end;

  CurCol := 10;

  CloseHandle (Sem_Main);
  CloseHandle (ST1);
  CloseHandle (ST2);

  Form1.Enabled := True;
end;

end.
Первый раз правильно. Второй раз попадает в тупик (где-то виснет)
Sibedir вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Написать программу для Паскаль 9 класс: составить программу которая печатает таблицу умножения и сложения натуральных чисел goodula Помощь студентам 0 23.01.2014 17:39
Написать программу,которая выводит таблицу умножения например на 7. _Алексей_ Помощь студентам 1 13.06.2012 16:16
Написать программу, в ходе выполнения которой... AzaroffV Фриланс 7 21.01.2011 15:02
17 Составить программу, которая печатает таблицу умножения и сложения натуральных чисел в шестнадцатеричн OTLi4HO Общие вопросы C/C++ 1 16.01.2009 13:59
В среде Delphi составить программу (процесс), который паралельно запускает два потока (нити) metamfetamin Помощь студентам 9 06.11.2007 15:26