Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 27.12.2009, 19:04
Аватар для march
march march вне форума
Начинающий
 
Регистрация: 04.05.2009
Сообщения: 110
Репутация: 18
По умолчанию Программное создание и использование потоков

В общем, как программно создавать потоки и использовать их?
Ответить с цитированием
  #2  
Старый 04.01.2010, 13:33
Аватар для march
march march вне форума
Начинающий
 
Регистрация: 04.05.2009
Сообщения: 110
Репутация: 18
По умолчанию

Вроде как ответ нашел на первую часть вопроса и частично на второй:
Код:
unit Unit1;

interface

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

procedure incedit1;stdcall;
procedure incedit2;stdcall;


type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    Edit1: TEdit;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

var
 th1,th2:cardinal;
 h1,h2:integer;


procedure incedit1;
var
 i:integer;
begin
  
 i:=0;
 while true do
  begin
    form1.edit1.text:=inttostr(i);
    i:=i+1;
  end;

end;





procedure incedit2;
var
 i:integer;
begin
  i:=0;
 while true do
  begin
    {text2}form1.Edit2.text:=inttostr(i);
    i:=i+1;
  end;
end; 

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 h1:=beginthread(nil,1024,@incedit1,nil,0,th1);
 h2:=beginthread(nil,1024,@incedit2,nil,0,th2);
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
  suspendthread(h1); 
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 suspendthread(h2); 
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
 resumethread(h1);
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
 resumethread(h2);
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
 terminatethread(h1,0); 
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
 terminatethread(h2,0);
end;

end.
Но это все применимо, если только создавать объекты VCL не программно: через форму добавления объектов.
Код:
unit Unit1;

interface

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

procedure incedit1;stdcall;
procedure incedit2;stdcall;


type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Button7: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);

  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

var
 th1,th2:cardinal;
 h1,h2:integer;

procedure incedit1;
var
 i:integer;
 text1:tedit;
begin
  text1:=tedit.Create(form1);
   text1.parent:=form1;
   text1.name:= 'edit1';
   text1.left:= 224;
   text1.top:= 16;
   text1.Height:=20;
   text1.Width:= 65; 

 i:=0;
 while true do
  begin
    text1.text:=inttostr(i);
    i:=i+1;
  end;

end;





procedure incedit2;
var
 i:integer;
 text2:tedit;
begin
 text2:=tedit.Create(form1);
  text2.parent:=form1;
  text2.name:= 'edit2';
  text2.left:= 224;
  text2.top:= 40;
  text2.Height:=20;
  text2.Width:= 65;
 i:=0;
 while true do
  begin
    text2.text:=inttostr(i);
    i:=i+1;
  end;
end; 

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 h1:=beginthread(nil,1024,@incedit1,nil,0,th1);
 h2:=beginthread(nil,1024,@incedit2,nil,0,th2);
end;



procedure TForm1.Button2Click(Sender: TObject);
begin
  suspendthread(h1); 
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
 suspendthread(h2); 
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
 resumethread(h1);
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
 resumethread(h2);
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
 terminatethread(h1,0); 
end;

procedure TForm1.Button7Click(Sender: TObject);
begin
 terminatethread(h2,0);
end;

end.
В этом примере объекты создаются, но уже не принемают значения i:integer и исчезают после завершения потока. Synchronize применить не получилось (по крайней мере, я не смог). В общем прошу помощи:
1. Как сделать чтобы edit'ы в данном примере не пропадали после завершения процесса и они были восприимчивы к передаваемым им данным из потока.
2. Чтобы программа не рушилась из-за передаваемых ей одновременно данных из разных потоков.

Последний раз редактировалось march, 04.01.2010 в 13:36. Причина: запутался с тегами)))
Ответить с цитированием
  #3  
Старый 04.01.2010, 15:12
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Маньяк!!! В VCL есть специальный класс TThread, предназначенный для создания потоков и работы с ними. Гораздо удобнее, чем мучиться с ниме через API.
Ответить с цитированием
  #4  
Старый 04.01.2010, 16:04
Аватар для march
march march вне форума
Начинающий
 
Регистрация: 04.05.2009
Сообщения: 110
Репутация: 18
По умолчанию

Тогда с какой статьи начать? (а то, как видите "начал" сам )
И И поток через VCL не будет ли менее производителен (к примеру, если потоков 5 и более?)

---------------------
как использовать потоки через tthread, вроде, разобрался
остался вопрос по эффективности потоков и VCL-потоков

Последний раз редактировалось march, 06.01.2010 в 11:05.
Ответить с цитированием
  #5  
Старый 14.06.2010, 18:53
coldsv coldsv вне форума
Прохожий
 
Регистрация: 14.06.2010
Сообщения: 2
Репутация: 10
По умолчанию

Это форум про ВСЛ или можно предложить ВИНАПИ вариант?

Последний раз редактировалось coldsv, 14.06.2010 в 18:56.
Ответить с цитированием
  #6  
Старый 14.06.2010, 19:13
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,096
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

При создании потоков надо обладать следующими знаниями:
1. Понимать что такое потоки вообще. Хорошо будет, если ты разберешься как потоки организуются на WinAPI.
2. Понимать принципы работы с объектами класса TThread.
3. Разобраться как использовать Synchronize.
4. Прочитать про клитические секции (CriticalSection).
5. Ну и в твоем примере понимать принципы создания объектов VCL (в данном случае TEdit) - кто у объекта родитель и кто владелец (Parent и Owner).

Проблем при создании потоков через VCL с производительностю будет ровно стролько же, сколько и через WinAPI. Но через TThread ты получаешь несколько удобных механизмов управления ими, что при использовании WinAPI тебе придется делать самому. Оверхед там практически отсутсвует.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 14:43.


 

Сайт

Форум

FAQ

Соглашения

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2025