![]() |
|
|
Регистрация | << Правила форума >> | 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 тебе придется делать самому. Оверхед там практически отсутсвует. |