Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.02.06;
Скачать: [xml.tar.bz2];

Вниз

Потоки   Найти похожие ветки 

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.003 c
15-1283143365
Anatoly Podgoretsky
2010-08-30 08:42
2011.02.06
Выбор почтового клиента для 7


15-1288158923
palva
2010-10-27 09:55
2011.02.06
Microsoft побеждает


6-1233941498
FireMan_Alexey
2009-02-06 20:31
2011.02.06
По какому протоколу ИЕ автоматически определяет настройки прокси?


4-1244198418
GF
2009-06-05 14:40
2011.02.06
Курсор в определенной области. Отталкивание


15-1287952139
Юрий
2010-10-25 00:28
2011.02.06
С днем рождения ! 25 октября 2010 понедельник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский