Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 30.09.2010, 15:21   #1
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию Идея реализации скелета класса

Есть объект А класса (должен распознавать текст). Процесс распознавания должен выглядеть так:
Код:
А:=*.Create;
A.image:=TBitmap(bmp);
A.onRecognizer:=...
A.Recognize;
Сначала думал унаследовать класс от потока, но он бы мог распознавать только одну картинку, т.е. такое не сработало бы:
Код:
А:=*.Create;
A.image:=TBitmap(bmp);
A.onRecognizer:=...
A.Recognize;
A.image:=TBitmap(bmp2);
A.Recognize;
Можно конечно написать класс, в процедуре Recognize которого будет создаваться отдельный поток, но это не очень красиво. Собственно вопрос состоит в том, как сделать поток с многоразовой Execute (без использования внутри Execute событий(Event'ов/WaitForSingleObject)?
TwiX вне форума Ответить с цитированием
Старый 30.09.2010, 15:29   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А что за проблема описать свой класс на основе TThread, и тогда каждый объект будет владеть своим потоком.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.09.2010, 15:40   #3
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Я же говорю, что не понимаю как сделать многоразовый поток, не засоряя Execute разными событиями. Допустим мы создали объект на основе потоке и остановили его в конструкторе. Занесли туда нужные данные, вызвали Recognize - она запустила поток, там в Execute распозналась картинка и поток убился. Ещё раз занеси в этот объект картинку и вызвать Recognize не получится...
TwiX вне форума Ответить с цитированием
Старый 30.09.2010, 15:47   #4
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

тебе нужно свой класс тогда писать, с иной структурой ThreadFunc
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 30.09.2010, 16:32   #5
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Код:
type
  TRecognizer = class
  private
    FRecognize: TNotifyEvent;  
  protected 
    FRecognizedText: String;
    FImg: TBitmap;
    procedure DoRecognize;
  public
    constructor Create(const AImg: TBitmap); virtual;
    procedure Recognize;
    property RecognizedText: String read FRecognizedText;
    property OnRecognize: TNotifyEvent read FRecognize write FRecognize;
  end;

constructor TRecognizer.Create(const AImg: TBitmap); 
begin
  inherited Create;
  FImg := AImg;
end;

procedure TRecognizer.Recognize;
begin
  FRecognizedText := // распознать текст в FImg
  DoRecognize; // вызвать событие
end;

procedure TRecognizer.DoRecognize;
begin
  if Assigned(FRecognize) then
    FRecognize(Self);
end;
С потоками:

Код:
type
  TRecognizer = class
  private
    FRecognize: TNotifyEvent;  
  protected 
    FRecognizedText: String;
    FImg: TBitmap;
    procedure DoRecognize;
    procedure InternalRecognize;
  public
    constructor Create(const AImg: TBitmap); virtual;
    procedure Recognize;
    property RecognizedText: String read FRecognizedText;
    property OnRecognize: TNotifyEvent read FRecognize write FRecognize;
  end;

constructor TRecognizer.Create(const AImg: TBitmap); 
begin
  inherited Create;
  FImg := AImg;
end;

procedure TRecognizer.InternalRecognize;
begin
  FRecognizedText := // распознать текст в FImg
  DoRecognize; // вызвать событие
end;

procedure TRecognizer.DoRecognize;
begin
  if Assigned(FRecognize) then
    FRecognize(Self);
end;

function ThreadWrapper(ARecognizer: TRecognizer): Cardinal; stdcall;
begin
  ARecognizer.InternalRecognize;
  Result := 0;
end;

procedure TRecognizer.Recognize;
begin
  QueueUserWorkItem(@ThreadWrapper, Pointer(Self), WT_EXECUTELONGFUNCTION);
end;
Примечание: это говно-код (нет обработки ошибок).

См. также:
- http://msdn.microsoft.com/en-us/libr...57(VS.85).aspx
- http://www.transl-gunsmoker.ru/2010/...rworkitem.html
- http://www.gunsmoker.ru/2008/12/static-delphi.html
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.

Последний раз редактировалось GunSmoker; 01.10.2010 в 12:42.
GunSmoker вне форума Ответить с цитированием
Старый 30.09.2010, 16:45   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
не засоряя Execute разными событиями
Поясни пожалуйста эту фразу.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 30.09.2010, 18:06   #7
BOBAH13
Android Developer
Старожил Подтвердите свой е-майл
 
Аватар для BOBAH13
 
Регистрация: 19.02.2007
Сообщений: 3,708
По умолчанию

Цитата:
Я же говорю, что не понимаю как сделать многоразовый поток, не засоряя Execute разными событиями.
Вы идете вопреки стандартам и логике вообще нитей. Нить по сути, это начало и конец кода. Даже главный поток это цикл обработки сообщений.
Нужно делать зацикливание или тот же WaitForSingleObject + мютекси или ивенты, что угодно, по которым будет вызываться ваш код, желаемый повторяться при каждом вызовае Execute, потом же, сделать переменную в описании вашего TThread класса, которая бы сигнализировала об окончании данного потока, тот же Terminated.

Так что почитайте, уже делали люди подобные вещи, так будете видеть логику действий.
BOBAH13 вне форума Ответить с цитированием
Старый 01.10.2010, 04:20   #8
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

Фуф, написал распознавание... Осталось переделать в поток
GunSmoker, что за ARecognizer? Одним классом это сделать не получится?
Stilet, я имел в виду, что хочу сделать многоразовый Execute
BOBAH, Теперь понимаю, что несколько раз замутить Execute у потока не получится... А хотелось бы)) Спасибо
TwiX вне форума Ответить с цитированием
Старый 01.10.2010, 12:40   #9
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Цитата:
Сообщение от TwiX Посмотреть сообщение
Одним классом это сделать не получится?
Где вы нашли у меня в коде два класса? Назовите их. Класс один - TRecognizer.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 04.10.2010, 02:52   #10
TwiX
Участник клуба
 
Аватар для TwiX
 
Регистрация: 28.07.2009
Сообщений: 1,510
По умолчанию

функцию ThreadWrapper запихнуть в касс не получится?
TwiX вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Идея doniyor Свободное общение 4 24.04.2010 21:53
Параметр конструктора класса = объект этого класса nazavrik Общие вопросы C/C++ 6 14.02.2010 13:48
идея uk2 Свободное общение 31 25.12.2009 11:36
Если в классе объявить объект другого класса,будет ли видно переменные первого класса из объекта второго? TwiX Общие вопросы Delphi 3 15.11.2009 00:54
Нужна идея viter.alex Microsoft Office Word 13 06.02.2009 00:07