![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | 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 - удаляет объект и обнуляет ссылку |