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



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

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 03.11.2010, 11:35
bistriy bistriy вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 31
Репутация: 0
По умолчанию Выполнение функции в отдельном потоке

Я хочу реализовать поиск каждой картинки по скриншоту в отдельном потоке.

Как мне это реализовать ?

Есть такая схема:
Вот есть функция которая сравнивает картинку с скриншотом. И она возвращает true если картинка найдена. Вот эту функцию нужно выполнять в отдельном потоке. Причем новый поток нужно открывать по каждому запросу на выполнение этой функции. После ее выполнения нужно возвращать значение true или false и обязательно закрывать поток.

СПЕЦИАЛИСТЫ И ПРОГРАММИСТЫ ПОМОГИТЕ МНЕ ПОЖАЛУСТА !!
НАПИШИТЕ КОД С ПОДРОБНЫМИ КОММЕНТАРИЯМИ.

-----------------------------------------------------------------------

Колбасня какая !! Что , никто не может нописать нормально про потоки ?
Как они запускаються к их оставить работать, как остановить ?
Вот и всё . Где спецы на форуме ?

Последний раз редактировалось bistriy, 03.11.2010 в 17:40.
Ответить с цитированием
  #2  
Старый 03.11.2010, 19:02
bistriy bistriy вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 31
Репутация: 0
По умолчанию Сам разобрался.

--------------------------------------------------------------------------
Вот я сам уже разобрался как работают потоки.
И для новичков привожу код в котором есть и создание потока и выполнение функции в потоке и завершение потока по нажатию кнопки 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  
Старый 05.11.2010, 10:08
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

вообще-то у TThread есть property Terminated: Boolean и procedure Terminate
а чтобы русские буквы нормально копировались перед нажатием Ctrl+C нужно переключится на русский язык)
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #4  
Старый 05.11.2010, 11:27
bistriy bistriy вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 31
Репутация: 0
По умолчанию Пожалуста.

Цитата:
Сообщение от NumLock
вообще-то у TThread есть property Terminated: Boolean и procedure Terminate
а чтобы русские буквы нормально копировались перед нажатием Ctrl+C нужно переключится на русский язык)

property Terminated: Boolean и procedure Terminate - а что это такое и как они описываються и работают? Объясните пожалуста понятно.
Ответить с цитированием
  #5  
Старый 05.11.2010, 11:34
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

а в справке не почитать?
Цитата:
TThread.Terminate

Signals the thread to terminate by setting the Terminated property to True.

procedure Terminate;

Description

Terminate sets the thread’s Terminated property to True, signaling that the thread should be terminated as soon as possible. Unlike the Windows API TerminateThread, which forces the thread to terminate immediately, the Terminate method merely requests that the thread terminate. This allows the thread to perform any cleanup before it shuts down.

For Terminate to work, the thread's Execute method and any methods that Execute calls should check Terminated periodically and exit when it's True.

Код:
var
  MyClientThread: TMyClientThread;

procedure TForm1.Button1Click(Sender: TObject);
begin
  MyClientThread.Terminate;
end;

procedure TMyClientThread.Execute;
begin
    while  not Terminated do
    begin
...
    end;
end;
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #6  
Старый 05.11.2010, 12:28
bistriy bistriy вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 31
Репутация: 0
По умолчанию Не понятно.

Всё таки не понятно как с английского переводиться. Напиши по русски пожалуста.
Проверил твой код добавил:
procedure TMyClientThread.Execute;
begin
while Terminated do
begin
ShowMessage('Вы закрыли поток');
end;
end;

И после нажатия Button1 вываливаеться ошибка. Я понял что MyClientThread.Terminate; досрочно прекращает работу потока . Правильно ?

Последний раз редактировалось bistriy, 05.11.2010 в 12:45.
Ответить с цитированием
  #7  
Старый 05.11.2010, 12:58
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

метод Terminate сигнализирует потоку, что тот должен быть прерван (но не прерывает его). конкретно он устанавливает свойство Terminated в true. при "правильном" написании кода в Execute нужно проверять свойство Terminated и когда оно true выходить из метода Execute.
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #8  
Старый 05.11.2010, 15:17
bistriy bistriy вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 31
Репутация: 0
По умолчанию

Цитата:
Сообщение от NumLock
метод Terminate сигнализирует потоку, что тот должен быть прерван (но не прерывает его). конкретно он устанавливает свойство Terminated в true. при "правильном" написании кода в Execute нужно проверять свойство Terminated и когда оно true выходить из метода Execute.

И в чём суть тут?
Код:
procedure TMyClientThread.Execute;
begin
while Terminated do
begin
ShowMessage('Вы закрыли поток');
end;
end;

И после нажатия Button1 вываливаеться ошибка.
ПОчему ошибка ?
Ответить с цитированием
  #9  
Старый 05.11.2010, 18:38
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

ну поток наверное создать нужно
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #10  
Старый 05.11.2010, 21:19
bistriy bistriy вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 31
Репутация: 0
По умолчанию С самого начала.

Цитата:
Сообщение от NumLock
ну поток наверное создать нужно

Привожу пример кода с самого начала :
Код:
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;
......
И после нажатия Button1 вываливаеться ошибка.
ПОчему ошибка ?
Ответить с цитированием
  #11  
Старый 05.11.2010, 22:35
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 7,788
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

какая ошибка? текст в студию...
Ответить с цитированием
  #12  
Старый 06.11.2010, 09:12
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

Код:
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.
http://data.cod.ru/73913
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
  #13  
Старый 06.11.2010, 11:24
bistriy bistriy вне форума
Прохожий
 
Регистрация: 30.10.2010
Сообщения: 31
Репутация: 0
По умолчанию Ладно проехали.

Объясни мне пожалуста, что значат каждая из этих строк в твоём коде :

MyThread.WaitFor;
FreeAndNil(MyThread);

Последний раз редактировалось bistriy, 06.11.2010 в 11:30.
Ответить с цитированием
  #14  
Старый 06.11.2010, 12:20
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,718
Репутация: 52347
По умолчанию

Почитайте фот эту статейку многое прояснится.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #15  
Старый 06.11.2010, 12:26
Аватар для NumLock
NumLock NumLock вне форума
Let Me Show You
 
Регистрация: 30.04.2010
Адрес: Северодвинск
Сообщения: 5,426
Версия Delphi: 7, XE5
Репутация: 59586
По умолчанию

WaitFor - ждет завершение потока
FreeAndNil - удаляет объект и обнуляет ссылку
__________________
Пишу программы за еду.
__________________
Ответить с цитированием
Ответ



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

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

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

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


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


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

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

ВКонтакте   Facebook   Twitter   Ссылка на Telegram