|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Выполнение функции в отдельном потоке
Я хочу реализовать поиск каждой картинки по скриншоту в отдельном потоке.
Как мне это реализовать ? Есть такая схема: Вот есть функция которая сравнивает картинку с скриншотом. И она возвращает true если картинка найдена. Вот эту функцию нужно выполнять в отдельном потоке. Причем новый поток нужно открывать по каждому запросу на выполнение этой функции. После ее выполнения нужно возвращать значение true или false и обязательно закрывать поток. СПЕЦИАЛИСТЫ И ПРОГРАММИСТЫ ПОМОГИТЕ МНЕ ПОЖАЛУСТА !! НАПИШИТЕ КОД С ПОДРОБНЫМИ КОММЕНТАРИЯМИ. ----------------------------------------------------------------------- Колбасня какая !! Что , никто не может нописать нормально про потоки ? Как они запускаються к их оставить работать, как остановить ? Вот и всё . Где спецы на форуме ? Последний раз редактировалось bistriy, 03.11.2010 в 17:40. |
#2
|
|||
|
|||
Сам разобрался.
--------------------------------------------------------------------------
Вот я сам уже разобрался как работают потоки. И для новичков привожу код в котором есть и создание потока и выполнение функции в потоке и завершение потока по нажатию кнопки Button1 с выводом сообщения о завершении работы потока. Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TNewThread = class(TThread) private Progress: integer; procedure SetProgress; protected procedure Execute; override; end; TForm1 = class(TForm) Button1: TButton; procedure FormCreate(Sender: TObject); procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; NajaliButton1:Boolean; i:Boolean; implementation {$R *.dfm} procedure TNewThread.Execute; var OnTerminated:Boolean; begin While OnTerminated do begin sleep(50); Synchronize(SetProgress); If i=true then begin OnTerminated:=false; end; end; end; procedure TNewThread.SetProgress; begin i:=NajaliButton1; If i=true then begin ShowMessage('Вы закрыли поток.'); end; end; procedure TForm1.FormCreate(Sender: TObject); var NewThread:TNewThread; begin NewThread:=TNewThread.Create(true); NewThread.FreeOnTerminate:=true; NewThread.Priority:=tpLower; NewThread.Resume; end; procedure TForm1.Button1Click(Sender: TObject); begin NajaliButton1:=true; end; end. Может кто нибудь подскажет что за странная белибирда вместо букв после копирования русских букв из delphi сюда. Последний раз редактировалось bistriy, 03.11.2010 в 19:05. |
#3
|
||||
|
||||
вообще-то у TThread есть property Terminated: Boolean и procedure Terminate
а чтобы русские буквы нормально копировались перед нажатием Ctrl+C нужно переключится на русский язык) Пишу программы за еду. __________________ |
#4
|
|||
|
|||
Пожалуста.
Цитата:
property Terminated: Boolean и procedure Terminate - а что это такое и как они описываються и работают? Объясните пожалуста понятно. |
#5
|
||||
|
||||
а в справке не почитать?
Цитата:
Код:
var MyClientThread: TMyClientThread; procedure TForm1.Button1Click(Sender: TObject); begin MyClientThread.Terminate; end; procedure TMyClientThread.Execute; begin while not Terminated do begin ... end; end; Пишу программы за еду. __________________ |
#6
|
|||
|
|||
Не понятно.
Всё таки не понятно как с английского переводиться. Напиши по русски пожалуста.
Проверил твой код добавил: procedure TMyClientThread.Execute; begin while Terminated do begin ShowMessage('Вы закрыли поток'); end; end; И после нажатия Button1 вываливаеться ошибка. Я понял что MyClientThread.Terminate; досрочно прекращает работу потока . Правильно ? Последний раз редактировалось bistriy, 05.11.2010 в 12:45. |
#7
|
||||
|
||||
метод Terminate сигнализирует потоку, что тот должен быть прерван (но не прерывает его). конкретно он устанавливает свойство Terminated в true. при "правильном" написании кода в Execute нужно проверять свойство Terminated и когда оно true выходить из метода Execute.
Пишу программы за еду. __________________ |
#8
|
|||
|
|||
Цитата:
И в чём суть тут? Код:
procedure TMyClientThread.Execute; begin while Terminated do begin ShowMessage('Вы закрыли поток'); end; end; И после нажатия Button1 вываливаеться ошибка. ПОчему ошибка ? |
#9
|
||||
|
||||
ну поток наверное создать нужно
Пишу программы за еду. __________________ |
#10
|
|||
|
|||
С самого начала.
Цитата:
Привожу пример кода с самого начала : Код:
var MyClientThread: TMyClientThread; ... procedure TForm1.FormCreate(Sender: TObject); begin MyClientThread:=TMyClientThread.Create(true); MyClientThread.FreeOnTerminate:=true; MyClientThread.Priority:=tpLower; MyClientThread.Resume; end; procedure TForm1.Button1Click(Sender: TObject); begin MyClientThread.Terminate; end; procedure TMyClientThread.Execute; begin while Terminated do begin ShowMessage('Вы закрыли поток'); end; end; ...... ПОчему ошибка ? |
#11
|
|||
|
|||
какая ошибка? текст в студию...
|
#12
|
||||
|
||||
Код:
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls; type TMyThread = class(TThread) private dummy: Integer; procedure Updt; protected procedure Execute; override; end; TForm1 = class(TForm) Button1: TButton; Button2: TButton; Label1: TLabel; 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; begin dummy:=0; while not Terminated do begin Synchronize(Updt); Sleep(100); Inc(dummy); end; dummy:=MaxInt; Synchronize(Updt); end; { TForm1 } procedure TMyThread.Updt; begin Form1.Label1.Caption:=IntToStr(dummy); end; procedure TForm1.Button1Click(Sender: TObject); begin if MyThread=nil then begin MyThread:=TMyThread.Create(True); MyThread.FreeOnTerminate:=False; MyThread.Resume; end; end; procedure TForm1.Button2Click(Sender: TObject); begin if MyThread<>nil then begin MyThread.Terminate; MyThread.WaitFor; FreeAndNil(MyThread); end; end; end. Пишу программы за еду. __________________ |
#13
|
|||
|
|||
Ладно проехали.
Объясни мне пожалуста, что значат каждая из этих строк в твоём коде :
MyThread.WaitFor; FreeAndNil(MyThread); Последний раз редактировалось bistriy, 06.11.2010 в 11:30. |
#15
|
||||
|
||||
WaitFor - ждет завершение потока
FreeAndNil - удаляет объект и обнуляет ссылку Пишу программы за еду. __________________ |