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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.01.2014, 10:22   #1
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию Потоки

Всем Привет!

Нарыл код, немного доработав и вот:
Код:
unit Unit1;

interface

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

type
  TMyThread = class(TThread)
  private
  answer: Integer;
  protected
  procedure ShowResult;
  procedure Execute; override;
  end;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Button2: TButton;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  MyThread: TMyThread;

implementation

{$R *.dfm}

{ TMyThread }

procedure TMyThread.Execute;
 var
    i:Integer;
 begin
    //inherited;
    for i:=1 to 250 do
       begin
       answer:=answer+1;
       Synchronize(ShowResult);
       sleep(50);
       if MyThread.Terminated then break;
       end;
 end;

procedure TMyThread.ShowResult;
 begin
    Form1.Edit1.Text:=IntToStr(answer);
 end;

procedure TForm1.Button1Click(Sender: TObject);
 begin
    MyThread:=TMyThread.Create(False);
    MyThread.Priority:=tpLower;
 end;

procedure TForm1.Button2Click(Sender: TObject);
 begin
    MyThread.Terminate;
 end;

end.
При нажатии на Button1 два раза запускается два потока но результат этих двух потоков выводиться в Edit1, как сделать чтоб второй поток выводился в Edit2? Я понимаю что можно создать еще две процедуры но это не выход, а если потребуется с десяток потоков?

С потоками не работал, ломал голову но не получается, помогите
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!

Последний раз редактировалось Stilet; 21.01.2014 в 11:29.
spirit-ua вне форума Ответить с цитированием
Старый 21.01.2014, 10:28   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Или при создании потока передавать ему Edit в качестве параметра, или свойство соответствующее у потока сделать. А при создании уже разруливать, какой эдит передать
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.01.2014, 10:51   #3
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
... свойство соответствующее у потока сделать. А при создании уже разруливать, какой эдит передать
Я думал в эту сторону но как?
Свойство в потоке это счетчик который будет увеличиваться при создании очередного потока? Как передать Едит в поцедуру и как разрулить по разных Едитах?

Не посчитайте за наглость но, допилите пожалуйста код
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!
spirit-ua вне форума Ответить с цитированием
Старый 21.01.2014, 11:14   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Передать так например
Код:
TMyThread = class(TThread)
  private
  answer: Integer;
    lEdit: TEdit;
  protected
  procedure ShowResult;
  procedure Execute; override;
  public
    constructor Create(Edit: TEdit);
  end;

constructor TMyThread.Create(Edit: TEdit);
begin
  inherited Create(True);
  lEdit:=Edit;
  Priority:=tpLower;
  Resume;
end;
А разруливать - ну держите счетчик кликов и массив эдитов и передавайте нужный.
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.01.2014, 13:18   #5
spirit-ua
Форумчанин
 
Аватар для spirit-ua
 
Регистрация: 04.06.2009
Сообщений: 351
По умолчанию

Аватар, спасибо!

Посмотрите код, уверен что можно оптимизировать, ткните носом на ошибки

Код:
unit Unit1;

interface

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

type
  TMyThread = class(TThread)
  private
     answer: Integer;
     TH_Edit: TEdit;
  protected
     procedure ShowResult;
     procedure Execute; override;
  public
     constructor Create(EDIT: TEdit);
  end;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

const
  count_max = 5;

var
  Form1: TForm1;
  MyThread: TMyThread;
  count_i: integer = 0;
  mas_Edit: array[1..count_max] of TEdit;

implementation

{$R *.dfm}

{ TMyThread }

procedure TMyThread.Execute;
 var
    i:Integer;
 begin
    for i:=1 to 250 do
       begin
       answer:=answer+1;
       Synchronize(ShowResult);
       sleep(50);
       if MyThread.Terminated then break;
       end;
 end;

procedure TMyThread.ShowResult;
 begin
    TH_Edit.Text:=IntToStr(answer);
 end;

constructor TMyThread.Create(EDIT: TEdit);
 begin
    inherited Create(True);
    TH_Edit:=EDIT;
    Priority:=tpLower;
    Resume;
 end;

procedure TForm1.Button1Click(Sender: TObject);
 begin
    Inc(count_i);
    if count_i <= count_max then
       begin
       mas_Edit[count_i] := TEdit.Create(nil);
       mas_Edit[count_i].Parent := Form1;
       mas_Edit[count_i].Left := 10;
       if count_i = 1 then mas_Edit[count_i].Top := 10
          else mas_Edit[count_i].Top := mas_Edit[count_i-1].Top + mas_Edit[count_i-1].Height + 5;
       MyThread:=TMyThread.Create(mas_Edit[count_i]);
       end;
 end;

procedure TForm1.Button2Click(Sender: TObject);
 begin
    MyThread.Terminate;
 end;

end.
Мне разрешено открывать только одну страницу - about :blank. Сперва было скучно, но потом я втянулся. Теперь у меня там живет 2 виртуальных друга, и я слышу голоса из розетки!

Последний раз редактировалось spirit-ua; 21.01.2014 в 13:24.
spirit-ua вне форума Ответить с цитированием
Старый 21.01.2014, 14:15   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

А чего его оптимизировать, учебный код ни о чем. С таким же успехом это можно и через таймер сделать. Ваш MyThread.Terminate отработает только для последнего созданного потока и ни один поток не очищается в программе. TThreadList посмотрите
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 21.01.2014, 16:37   #7
phomm
personality
Старожил
 
Аватар для phomm
 
Регистрация: 28.04.2009
Сообщений: 2,882
По умолчанию

spirit-ua зачем такие сложности с попытками гадать на кофейной гуще ? Прочтите нормальные мануалы вроде http://forum.vingrad.ru/forum/topic-60076.html да смело в бой.
phomm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Потоки. Закрываются все потоки при ошибке в одном. Son Общие вопросы Delphi 11 01.11.2013 09:32
потоки AlexMe Общие вопросы Delphi 3 18.07.2011 05:17
Потоки С++ Aleksin Помощь студентам 1 07.11.2010 18:15
потоки Владимир1988 Помощь студентам 0 08.02.2010 23:12