Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.48 MB
Время: 0.01 c
2-1289371427
Кирей
2010-11-10 09:43
2011.02.06
Округление дробных чисел


15-1288271870
Правильный$Вася
2010-10-28 17:17
2011.02.06
DVD DL болванки - кто какие пользует и с какими приводами?


4-1245172423
Дмитрий
2009-06-16 21:13
2011.02.06
Как создать консольную форму


6-1233828325
WebBrowser+ table
2009-02-05 13:05
2011.02.06
работа с таблицами


6-1233923881
leonidus
2009-02-06 15:38
2011.02.06
Прерывание работы TidHTTP