Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
sectorb
1 / 1 / 0
Регистрация: 12.01.2010
Сообщений: 61
1

Работа с потоками

25.05.2010, 15:00. Просмотров 550. Ответов 0
Метки нет (Все метки)

Добрый день

Делаю многопоточную программу с 3емя потоками. Никак не получается сделать(( Сначала сортировало и выводило правильно, но не так как нужно. Щяс сделал правильно но программа отказывается работать
Подскажите где ошибки

Задание:
Напишите многопоточное приложение, реализующее межпроцессное взаимодействие по схеме
Сортировка по возрастанию значения.
В массив подается последовательность чисел: 3 2 1 6 5 4 9 8 7 …. N N-1 N-2, где N кратно трем.
т.е. мы подаем в массив 3 элемента(1 поток), сортируем его(2 поток) и выводим (3 поток)
p.s. все работает но выводит совсем не то что нужно

и кстати, синхронизацию выполняю с помощью крит секции (не совсем разобрался в ней но написал вроде правильно)

Unit1
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
unit Unit1;
 
interface
 
uses
  windows, messages, sysutils, variants, classes, graphics,
  controls, forms, dialogs, stdctrls, syncobjs, ImgList, ExtCtrls;
 
type
  TForm1 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    ListBox1: TListBox;
    ListBox2: TListBox;
    Edit1: TEdit;
    Button3: TButton;
 
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
 
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form1: TForm1;
  n1,n2,n3,x,n:integer;
  i,l,r1,r2:integer;
  mas2: array [1..3] of integer;
  cs: tcriticalsection;
  F: TextFile;
 
implementation
uses unit2,unit3,unit4;
{$R *.DFM}
 
procedure TForm1.Button1Click(Sender: TObject);
var
 ss: TThreadScan;
 ss2: TThreadScan2;
 ss3: TThreadScan3;
begin
   cs := tcriticalsection.create;
   if Edit1.text='' then exit;
   l:=strtoint(Edit1.text);
   x:=0;
   ss:=TThreadScan.Create(true);
   ss.freeonterminate := true;
   ss2:=TThreadScan2.Create(true);
   ss2.freeonterminate := true;
   ss3:=TThreadScan3.Create(true);
   ss3.freeonterminate := true;
 for i:=1 to l do
   begin
   ss.Resume;
   ss2.Resume;
   ss3.Resume;
   end;
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
 listbox1.Clear;
 listbox2.Clear;
 edit1.Clear;
end;
end.
Unit2
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
unit Unit2;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;
 
type
  TThreadScan = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;
 
implementation
uses Unit1;
 
procedure TThreadScan.Execute;
var
  m:integer;
begin
cs.Enter;
   x:=x+3;
   n1:=x;
   n2:=x-1;
   n3:=x-2;
  for m:=1 to 3 do begin
   mas2[1]:=n1;
   mas2[2]:=n2;
   mas2[3]:=n3;
   end;
cs.Leave;
end;
end.
Unit3
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
unit Unit3;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;
 
type
  TThreadScan2 = class(TThread)
  private
    { Private declarations }
  protected
 
    procedure Execute; override;
  end;
 
implementation
uses Unit1,unit2;
 
procedure TThreadScan2.Execute;
var
  i,j,buf:integer;
begin
 
cs.Enter;
for i := 1 to 3 - 1 do
for j := 1 to 3 - i do
if mas2[j]>mas2[j+1] then
begin
buf:=mas2[j];
mas2[j]:=mas2[j+1];
mas2[j+1]:=buf;
end;
cs.Leave;
 
end;
end.
Unit4
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
unit Unit4;
 
interface
 
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls;
 
type
  TThreadScan3 = class(TThread)
  private
    { Private declarations }
  protected
    procedure Execute; override;
  end;
 
implementation
uses Unit2,unit3,unit1;
 
procedure TThreadScan3.Execute;
var
  i:integer;
begin
 
cs.Enter;
  form1.ListBox1.Items.Add(inttostr(n1));
  form1.ListBox1.Items.Add(inttostr(n2));
  form1.ListBox1.Items.Add(inttostr(n3));
 
  for i:=1 to 3 do
  begin
  form1.ListBox2.Items.Add(inttostr(mas2[i]));
  end;
cs.leave;
 
end;
end.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.05.2010, 15:00
Ответы с готовыми решениями:

Работа с потоками
ранее с потоками дел не имел. Суть. есть код приложения. работает норм. ищет...

Работа с потоками
Пытаюсь разобраться с потоками, но ничего не выходит :c Кому не сложно...

Работа с потоками
Имеется l:string, в котором хранится 2 байта в двоичной системе счисления....

Работа с потоками
Нужно создать третий поток содержащий случайные числа и четвертый поток,...

Работа с потоками TStream
Кто может пояснить почему нужно использовать 2* размер в потоке. var ...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.05.2010, 15:00

Работа с потоками ( 2 потока )
Только начинаю работать с потоками, вот практикуюсь. Подскажите что не так ,...

Работа с потоками (TThread) + реализация
При нажатию на кнопку код должен выполнятся в отдельном потоке, чтобы избежать...

Работа с потоками. Несколько потоков обращаются в один
Есть один поток, он заполняет массив значениями. И есть неограниченное...


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

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

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