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

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

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 12.11.2010, 00:26   #11
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Цитата:
Сообщение от Dеlphi Посмотреть сообщение
где ни будь будь вначале до потока:
Код:
section:= tcriticalsection.Create;
Извините не могу понять где разместить?
Цитата:
потом
Код:
 section.free
И это тоже где?
Вне процедуры же не получится.
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Старый 12.11.2010, 00:34   #12
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

первое например в FormCreate
а второе в FormDestroy
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.11.2010, 00:40   #13
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

спасибо, я подозревал, что именно так, но это уже будет не в юните потоков. Мож мне действительно сделать всё в одном юните.

После добавления этих критических секций Процедуры кнопок оставить как в моем первом посте?
Вообще я что-то запутался. Где оставить, где убрать и что в конце концов должно получиться?
Добавил Эти секции ничего не зависает, но значения лейблов не изменяется.
Код Voody зависает и с конструкторами и без конструкторов
Ищущий да обрящет

Последний раз редактировалось fredwriter; 12.11.2010 в 02:17.
fredwriter вне форума Ответить с цитированием
Старый 12.11.2010, 02:25   #14
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

а поставьте после Synchronize
sleep(100);

думаю увидите разницу.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.11.2010, 02:29   #15
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Спасибо за помощь
Заработало, но не понятно почему, и, вообще многое здесь непонятно, так как много нового, еще не успело уложиться в голове, а для того что-бы уложилось нужно понимать вообще что это.
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Старый 12.11.2010, 03:14   #16
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

http://programmersforum.ru/showpost....14&postcount=5
я же обьяснил причину.
если вы вгрызаете свой код в основной, то когда же код с основного окна выполнятся будет?(обновления окна и тд)
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.11.2010, 03:45   #17
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Спасибо большое Пепел Феникса.
Немного не в тему:
Как узнать номер элемента в строке Memo
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Старый 12.11.2010, 04:21   #18
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

номер какого элемента?
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 12.11.2010, 04:25   #19
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Например вывести что-то в первой строке memo c j-го номера столбца
То есть нужно узнать номер строки и номер столбца в memo
Не могу понять в чём ошибка, пишет unsatisfied forward or external declaration {имя процедуры}. execute
Вот код:
Код:
unit Sravn_Sort_Unit;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Sort_Unit, ComCtrls, Grids;

type
  Massiv_f2 = array[1..1000] of integer;
  TForm2 = class(TForm)
    Button1: TButton;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Label4: TLabel;
    Edit1: TEdit;
    Label5: TLabel;
    Button2: TButton;
    StringGrid1: TStringGrid;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TPuzir_Thread = class(TThread)
    private
      mass_f2, B_Mass_f2, D_A_f2: Massiv_f2;
    protected
      procedure Execute; override;
    public
      procedure UpdateLabel;
  end;
Жырным выделена строка с ошибкой.
Тот же самый код, в приложении с индексами работает нормально.
Спасибо сам разобрался.
Ищущий да обрящет

Последний раз редактировалось fredwriter; 12.11.2010 в 14:57.
fredwriter вне форума Ответить с цитированием
Старый 12.11.2010, 15:08   #20
fredwriter
Форумчанин
 
Регистрация: 06.10.2009
Сообщений: 121
По умолчанию

Не могу понять почему выполняются два потока, а другие два пропускаются и вообще не выполняются.
Те потоки которые пропускаются выделены жырным в коде кнопки запуска
Вот код:
Код:
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 := Mass_f2[i_p];
    j_p := i_p - 1;
    while (Mass_f2[j_p] > Tmp) and (j_p >= 1) do
    begin
      Mass_f2[j_p + 1] := Mass_f2[j_p];
      o := j_p + 1;
      Dec(j_p);
    end;
    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.
Ищущий да обрящет
fredwriter вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки StudeHt Помощь студентам 1 06.05.2010 16:26
потоки tanek Помощь студентам 6 15.03.2010 21:42
потоки Владимир1988 Помощь студентам 0 08.02.2010 23:12