Текущий архив: 2011.02.06;
Скачать: CL | DM;
ВнизПотоки Найти похожие ветки
← →
Fredwriter © (2010-11-13 09:56) [0]Здравствуйте, пишу программу с использованием потоков первый раз в жизни.
Не могу понять почему выполняются два потока, а другие два пропускаются и вообще не выполняются.
Те потоки? которые пропускаются выделены жырным в коде кнопки запуска, если убрать из кнопки потоки, которые выполняются, то потоки, которые пропускаются, всё равно пропускаются
Вот код:
Код Delphi
type
Massiv_f2 = array[1..1000] of integer;
DataArray = array[1..1000] of integer;
TPuzir_Thread = class(TThread)
private
protected
procedure Execute; override;
public
procedure UpdateStringGrid;
end;
TProstVKL_Thread = class(TThread)
private
protected
procedure Execute; override;
public
procedure UpdateStringGrid_1;
end;
TPodschet_Thread = class(TThread)
private
protected
procedure Execute; override;
public
procedure UpdateStringGrid_2;
end;
TQuick_Thread = class(TThread)
private
protected
procedure Execute; override;
public
procedure UpdateStringGrid_3;
end;
var
Form2: TForm2;
n_f2: integer;
implementation
//uses Shell_Unit;
{$R *.dfm}
var
mass_f2, B_Mass_f2: Massiv_f2;
h, p, g, d, k, q, z, y1, m, o: integer;
D_A_f2: DataArray;
Stop1, Stop2, Stop3, Stop4: boolean;
Procedure TPuzir_Thread.execute;
var
i, j: integer;
begin
for i := 1 to n_f2 do
begin
For j := 1 to n_f2 - i do
begin
if Mass_f2[j] > Mass_f2[j + 1] then
begin
g := Mass_f2[j];
Mass_f2[j] := Mass_f2[j + 1];
p := j;
h := j + 1;
Mass_f2[j + 1] := g;
Synchronize(UpdateStringGrid);
Sleep(100);
end;
end;
end;
end;
Procedure TPodschet_Thread.Execute;
var
i_p, j_p: integer;
begin
for i_p := 1 to N_f2 do
begin
k := 0;
for j_p := 1 to N_f2 do
if (Mass_f2[i_p] > Mass_f2[j_p]) or ((Mass_f2[i_p] = Mass_f2[j_p]) and (i_p > j_p)) then
Inc(k);
d := i_p;
Synchronize(UpdateStringGrid_2);
Sleep(100);
end;
end;
procedure TQuick_Thread.Execute;
procedure qs(l, r: integer; var it: DataArray);
var
i, j, i1, j1: integer;
x, y: integer;
begin
i1 := l;
j1 := r;
i := D_A_f2[l];
y := D_A_f2[(l + r) div 2];
j := D_A_f2[r];
if i <= y then
if y <= j then
x := y
else
if i <= j then
x := j
else
x := i
else
if y >= j then
x := y
else
if i >= j then
x := j
else
x := i;
repeat
while it[i1] < x do
i1 := i1 + 1;
while x < it[j1] do
j1 := j1 - 1;
if i1 <= j1 then
begin
y1 := it[i1];
it[i1] := it[j1];
q := i1;
z := j1;
it[j1] := y1;
Synchronize(UpdateStringGrid_3);
Sleep(100);
i1 := i1 + 1;
j1 := j1 - 1;
end;
until i1 > j1;
if l < j1 then
qs(l, j1, it);
if l < r then
qs(i1, r, it)
end;
begin
qs(1, n, D_A_f2);
end; { конец быстрой сортировки }
Procedure TProstVKL_Thread.Execute;
var
i_p, j_p, Tmp: integer;
begin
for i_p := 2 to n do
begin
Tmp := B_Mass_f2[i_p];
j_p := i_p - 1;
while (B_Mass_f2[j_p] > Tmp) and (j_p >= 1) do
begin
B_Mass_f2[j_p + 1] := B_Mass_f2[j_p];
o := j_p + 1;
Dec(j_p);
end;
B_Mass_f2[j_p + 1] := Tmp;
m := j_p + 1;
Synchronize(UpdateStringGrid_1);
Sleep(100);
end;
end;
procedure Zapoln_Mass;
var
i: integer;
begin
randomize;
For i := 1 to n_f2 do
begin
Mass_f2[i] := Random(100);
D_A_f2[i] := Random(100);
end;
end;
Procedure TQuick_Thread.UpdateStringGrid_3;
begin
Form2.StringGrid1.Cells[q, 3] := IntToStr(D_A_f2[q]);
Form2.StringGrid1.Cells[z, 3] := IntToStr(y1);
end;
Procedure TProstVKL_Thread.UpdateStringGrid_1;
begin
Form2.StringGrid1.Cells[o, 1] := IntToStr(Mass_f2[o]);
Form2.StringGrid1.Cells[m, 1] := IntToStr(Mass_f2[m]);
end;
Procedure TPuzir_Thread.UpdateStringGrid;
begin
Form2.StringGrid1.Cells[p, 0] := IntToStr(Mass_f2[p]);
Form2.StringGrid1.Cells[h, 0] := IntToStr(Mass_f2[h]);
end;
Procedure TPodschet_Thread.UpdateStringGrid_2;
begin
Form2.StringGrid1.Cells[k + 1, 2] := IntToStr(Mass_f2[d]);
end;
procedure TForm2.Button1Click(Sender: TObject);
var
i_p: integer;
begin
n_f2 := StrtoInt(Edit1.Text);
Zapoln_mass;
For i_p := 1 to n_f2 do
StringGrid1.Cells[i_p, 0] := IntToStr(Mass_f2[i_p]);
For i_p := 1 to n_f2 do
StringGrid1.Cells[i_p, 1] := IntToStr(Mass_f2[i_p]);
For i_p := 1 to n_f2 do
StringGrid1.Cells[i_p, 2] := IntToStr(Mass_f2[i_p]);
For i_p := 1 to n_f2 do
StringGrid1.Cells[i_p, 3] := IntToStr(Mass_f2[i_p]);
end;
procedure TForm2.Button2Click(Sender: TObject); //Кнопка запуска
begin
Stop1 := False;
Stop2 := False;
Stop3 := False;
Stop4 := False;
TQuick_Thread.Create(False);
TProstVKL_Thread.Create(False);
TPuzir_Thread.Create(False);
TPodschet_Thread.Create(False);
end;
end.
← →
И. Павел © (2010-11-13 11:36) [1]> а другие два пропускаются и вообще не выполняются.
Проверил: у меня все 4 потока стартовали нормально (можете сами проверить: пусть каждый поток первым делом добавляет свое имя к Caption).
Другое дело, если эти потоки делают не то, что вам нужно - тогда нужно разбираться в алгоритме.
← →
antonn © (2010-11-14 13:16) [2]
> Mass_f2[j] := Mass_f2[j + 1];
они все дружно ковыряют одну глобальную переменную?
а потом тут же в цикле, после несложных операций вызывают синхронизацию? Синхронизацию можно делать хотябы в теле цикла "for i := 1 to n_f2 do", т.е. вложенный цикл пусть отработает без задержек.
Страницы: 1 вся ветка
Текущий архив: 2011.02.06;
Скачать: CL | DM;
Память: 0.47 MB
Время: 0.004 c