![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
В общем, как программно создавать потоки и использовать их?
|
|
#2
|
||||
|
||||
|
Вроде как ответ нашел на первую часть вопроса и частично на второй:
Код:
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.Код:
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.1. Как сделать чтобы edit'ы в данном примере не пропадали после завершения процесса и они были восприимчивы к передаваемым им данным из потока. 2. Чтобы программа не рушилась из-за передаваемых ей одновременно данных из разных потоков. Последний раз редактировалось march, 04.01.2010 в 13:36. Причина: запутался с тегами))) |
|
#3
|
|||
|
|||
|
Маньяк!!! В VCL есть специальный класс TThread, предназначенный для создания потоков и работы с ними. Гораздо удобнее, чем мучиться с ниме через API.
|
|
#4
|
||||
|
||||
|
Тогда с какой статьи начать? (а то, как видите "начал" сам
)И И поток через VCL не будет ли менее производителен (к примеру, если потоков 5 и более?) --------------------- как использовать потоки через tthread, вроде, разобрался остался вопрос по эффективности потоков и VCL-потоков Последний раз редактировалось march, 06.01.2010 в 11:05. |
|
#5
|
|||
|
|||
|
Это форум про ВСЛ или можно предложить ВИНАПИ вариант?
Последний раз редактировалось coldsv, 14.06.2010 в 18:56. |
|
#6
|
|||
|
|||
|
При создании потоков надо обладать следующими знаниями:
1. Понимать что такое потоки вообще. Хорошо будет, если ты разберешься как потоки организуются на WinAPI. 2. Понимать принципы работы с объектами класса TThread. 3. Разобраться как использовать Synchronize. 4. Прочитать про клитические секции (CriticalSection). 5. Ну и в твоем примере понимать принципы создания объектов VCL (в данном случае TEdit) - кто у объекта родитель и кто владелец (Parent и Owner). Проблем при создании потоков через VCL с производительностю будет ровно стролько же, сколько и через WinAPI. Но через TThread ты получаешь несколько удобных механизмов управления ими, что при использовании WinAPI тебе придется делать самому. Оверхед там практически отсутсвует. |