Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 TTask, не понимаю что идёт не так  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 448
Привет!
Решил разобраться с TTask и использовать его в будущем проекте. Но...
Простая, казалось бы, задача: расставить на форме кнопки и в Caption занести некое значение

Пишу
procedure TForm1.Button1Click(Sender: TObject);
var
  i:Integer;
  btn:TButton;
  arrTasks: array of ITask;
begin
  SetLength(arrTasks,10);
  for I := 0 to 9 do
    begin
      btn:=TButton.Create(self);
      btn.Name:='btn'+i.ToString;
      btn.Parent:=Panel1;
      btn.Width:=70;
      btn.Left:=10+i*btn.Width+32*i;

      arrTasks[i] := TTask.Create(procedure ()
        var
          j,k:Integer;
          b:TButton;
        begin
          k:=i;
          b:=btn;
          j:=Random(100);
          TThread.Synchronize(nil,
             procedure()
             begin
               b.Caption := k.ToString+'='+j.ToString;
             end
          );
        end);

      arrTasks[i].Start;
    end;
end;


В результате Caption меняется на некоторых избранных кнопках, на остальных остаётся прежним.

ЧЯДНТ?

Спасибо.
6 июл 18, 11:16    [21548707]     Ответить | Цитировать Сообщить модератору
 Re: TTask, не понимаю что идёт не так  [new]
zinpub
Member

Откуда:
Сообщений: 272
Kast2K,

Захват локальной переменной в анонимную функцию происходит довольно странно иногда, я бы подумал явно передавать btn в процедуру.
6 июл 18, 11:20    [21548735]     Ответить | Цитировать Сообщить модератору
 Re: TTask, не понимаю что идёт не так  [new]
wadman
Member

Откуда: Санкт-Петербург
Сообщений: 24489
Kast2K
ЧЯДНТ?

Разнеси код по созданию кнопок и по работе с ними на разные кнопки.
А тут получается, что не понятно какой поток какую кнопку подхватывает.
6 июл 18, 11:23    [21548758]     Ответить | Цитировать Сообщить модератору
 Re: TTask, не понимаю что идёт не так  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 448
wadman
Kast2K
ЧЯДНТ?

Разнеси код по созданию кнопок и по работе с ними на разные кнопки.
А тут получается, что не понятно какой поток какую кнопку подхватывает.


Что-то не выходит каменный цветок :(
Пишет с00000005

  private
    AObjL:TObjectList;
....
procedure TForm1.FormCreate(Sender: TObject);
begin
  AObjL:=TObjectList.Create;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  i:Integer;
  btn:TButton;
begin
  for I := 0 to 9 do
    begin
      btn:=TButton.Create(self);
      btn.Name:='btn'+i.ToString;
      btn.Parent:=Panel1;
      btn.Width:=50;
      btn.Left:=10+i*btn.Width+32*i;

      AObjL.Add(btn);
    end;
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  i,c:Integer;
begin
  c:=AObjL.Count;

  for i := 0 to c-1 do
    begin
      CreateTsk(TButton(AObjL),i);
    end;
end;

procedure TForm1.CreateTsk(ABtn: TButton; Ai: Integer);
var
  task:ITask;
begin
  task := TTask.Create(procedure ()
    var
      j, i:Integer;
      b:TButton;
    begin
      i:=Ai;
      b:=ABtn;
      j:=Random(100);
      TThread.Synchronize(nil,
         procedure()
         begin
           b.Caption := i.ToString+'='+j.ToString; // валится здесь с с00000005
         end
      );
    end);
  task.Start;
end;


если разбавить CreateTsk с ShowMessage(ABtn.Caption), то видно, что изменения начинаются не с 0-й кнопки, а с 1-й
6 июл 18, 11:56    [21548962]     Ответить | Цитировать Сообщить модератору
 Re: TTask, не понимаю что идёт не так  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 448
Сумимасен за беспокойство, как говорится.

Сам олень.
Надо было писать TButton(AObjL.Items[i]) вместо TButton(AObjL)

Вопрос закрыт
6 июл 18, 11:58    [21548974]     Ответить | Цитировать Сообщить модератору
 Re: TTask, не понимаю что идёт не так  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10598
  private
    AObjL:TObjectList<TButton>;
....
procedure TForm1.FormCreate(Sender: TObject);
begin
  AObjL:=TObjectList<TButton>.Create;
end;
6 июл 18, 13:24    [21549272]     Ответить | Цитировать Сообщить модератору
 Re: TTask, не понимаю что идёт не так  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1930
_Vasilisk_,
Богохульник! Там же дженерики! Сейчас тебя некоторые на костер потащат. И кстати, в зависимости от того когда этот лист будет прибиваться, можно словить АВ, поскольку ТС задает овнера при создании кнопки. Лучше обычный TList<TButton>
6 июл 18, 15:25    [21549951]     Ответить | Цитировать Сообщить модератору
 Re: TTask, не понимаю что идёт не так  [new]
_Vasilisk_
Member

Откуда: Украина, Харьков
Сообщений: 10598
white_nigger
ТС задает овнера
Не заметил
white_nigger
Лучше обычный TList<TButton>
Лучше разобраться что и когда уничтожать
6 июл 18, 15:28    [21549972]     Ответить | Цитировать Сообщить модератору
 Re: TTask, не понимаю что идёт не так  [new]
white_nigger
Member

Откуда: Тула
Сообщений: 1930
_Vasilisk_
Лучше разобраться что и когда уничтожать
Согласен. Но нам сие неведомо (по крайней мере пока хрустальный шар не склею)
6 июл 18, 15:36    [21550010]     Ответить | Цитировать Сообщить модератору
 Re: TTask, не понимаю что идёт не так  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 448
_Vasilisk_
Лучше разобраться что и когда уничтожать

Тут все в порядке в рабочем проекте :) Сначала ObjList.Clear, а потом всё остальное
Спасибо за советы :)
9 июл 18, 10:20    [21555237]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить