Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник
Коллекция курьезных вопросов из форумов
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »
Страницы: 1 2

потоки(TThread) и свойства(property), не все понятно


Pcrepair ©   (04.06.18 19:33

Добрый день. Есть следующий демокод:

unit uNewThread;
interface
uses
 System.Classes,SysUtils,Dialogs,SyncObjs,StrUtils,ExtCtrls,Windows,
 WideStrUtils,Vcl.Forms;

 procedure  ThreadDoJob(const aHost:string; var aErrorMsg:string; var aIsJobDone:Boolean);

type
 DoJob = class(TThread)
 private
   fHost,fErrorMsg:string;
   fIsJobDone:Boolean;
 protected
   procedure Execute; override;
 public
   property ErrorMsg:string read fErrorMsg;
   property IsJobDone:Boolean read fIsJobDone;

   constructor Create(const aHost:string; var aErrorMsg:string; var aIsJobDone:Boolean);
   destructor Destroy; override;
 end;

implementation

procedure  ThreadDoJob(const aHost:string; var aErrorMsg:string; var aIsJobDone:Boolean);
var
 ThreadJob:DoJob;
begin
 ThreadJob:=DoJob.Create(aHost,aErrorMsg,aIsJobDone);
 aErrorMsg:=ThreadJob.ErrorMsg;
 aIsJobDone:=ThreadJob.IsJobDone;
end;

constructor DoJob.Create(const aHost:string; var aErrorMsg:string; var aIsJobDone:Boolean);
begin
 inherited Create(False);
 FreeOnTerminate := True;
 Self.Priority := tpLower;
 fHost:=aHost;
end;

destructor DoJob.Destroy;
begin
 inherited Destroy;
end;

procedure DoJob.Execute;
var
 flg:Boolean;
begin
 flg:=true;  (*or FALSE just for fun*)

 if flg then
 begin
   fIsJobDone:=TRUE;
   fErrorMsg:='7777';
 end
 else
 begin
   fIsJobDone:=FALSE;
   fErrorMsg:='6666';
 end;

end.


прогнозируемо aErrorMsg:=ThreadJob.ErrorMsg; и aIsMailSended:=ThreadJob.IsMailSended; выводят "ничего" в выше стоящий код

Вопрос : как вывести результат работы потока в обработчики но без "Synchronize", трубы и прочего из той же оперы а через "property". если такое для потока вообще возможно. что то читал про OnTerminate но ничего канкретно применительно к "property" не нашлось.


icp ©   (04.06.18 22:18[1]

при таком дизайне поток не нужен.
свойство если читать то оно возвращает значение. без разницы что это за класс.


icp ©   (04.06.18 22:27[2]

не "выводят" потому что там ничего нет.
а ничего нет потому что не присвоено.
дальше.
если ты планируешь создать поток и в след
строчке читать значение
то зачем тебе вообще поток.
переси код в экзекута в другую процедуру и не в потоке.
будет все тоже самое.


icp ©   (04.06.18 22:38[3]

ах да.
там еще и фрионтерминате.
просто интересно.
как ты собрался ловить ту наносекунду когда результат уже готов но поток еще не успел самовыпилиться?


Pcrepair ©   (04.06.18 22:44[4]

этот и есть мой вопрос - как


KSergey ©   (05.06.18 06:18[5]

> Вопрос : как вывести результат работы потока в обработчики
> но без "Synchronize", трубы и прочего из той же оперы а через "property".

Надо дождаться окончания работы потока (т.е. окончания выполнения DoJob.Execute) и после этого прочитать property


icp ©   (05.06.18 06:45[6]

тока после экзекута никакого свойства уже нет как и самого потока.
к тому же дождаться это эквивалентно тому когда екзекут выполняется в основном потоке


KSergey ©   (05.06.18 08:12[7]

> icp ©   (05.06.18 06:45) [6]
> тока после экзекута никакого свойства уже нет как и самого  потока.

Чего это вдруг?
Потока (операционной системы) конечно нет, а Delphi-объект - куда ж он делся? на месте он. Можно читать/писать свойства без проблем.

> к тому же дождаться это эквивалентно тому когда екзекут выполняется в основном потоке

"Ждать" не эквивалентно "стоять и ждать".
Можно заниматься чем-то полезным, проверяя периодически не завершился ли поток.
Ну или не проверять, а как-то иначе просигнализировать основному потоку "я выполнился" (сообщение через PostMEssage в главную форму кинуть хотя бы, например, как самое простое)


icp ©   (05.06.18 08:14[8]

с таво вдруг что фрионтерминэйт.
екзекут завершился и кирдык всему экземпляру настает


icp ©   (05.06.18 08:15[9]

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


KSergey ©   (05.06.18 08:18[10]

> Pcrepair ©   (04.06.18 19:33) 

Кстати, вставьте вот такую простую штуку - и, думаю, свойства у вас сразу прочитаются.

procedure  ThreadDoJob(const aHost:string; var aErrorMsg:
string; var aIsJobDone:Boolean);
var
 ThreadJob:DoJob;
begin
 ThreadJob:=DoJob.Create(aHost,aErrorMsg,aIsJobDone);
 Sleep(0);
 aErrorMsg:=ThreadJob.ErrorMsg;
 aIsJobDone:=ThreadJob.IsJobDone;
end;


KSergey ©   (05.06.18 08:19[11]

> icp ©   (05.06.18 08:14) [8]
> с таво вдруг что фрионтерминэйт.

Да, не заметил, извиняюсь.
Его убрать, конечно, смысла с него нет, тем более в данном случае.


KSergey ©   (05.06.18 08:20[12]

> icp ©   (05.06.18 08:15) [9]
> сказано же по русски.
> что в таком дизайне поток здесь нафик не нужен.

Ясно же, что пример крайне демонтрационый
как раз для понимания всех этих моментов


icp ©   (05.06.18 08:22[13]

вот для понимания я и сказал ему.
что если делать как он хочет то не надо лепить поток.
ибо смысла ноль


Leonid Troyanovsky ©   (05.06.18 08:28[14]


> icp ©   (05.06.18 08:14) [8]

> екзекут завершился и кирдык всему экземпляру настает

Сначала выполнится онтерминэйт  в первичном потоке,
а уж потом "екзекут завершился и кирдык всему".

--
Regards, LVT.


icp ©   (05.06.18 08:51[15]

да да.
остается только поймать этот миг.
когда уже готово но все еще живо.
без извратов то неможно


Leonid Troyanovsky ©   (05.06.18 09:13[16]


> icp ©   (05.06.18 08:51) [15]

> остается только поймать этот миг.
> когда уже готово но все еще живо.

Я ж и говорю, что в OnTerminate этих мгновений м.б. хоть 17.

--
Regards, LVT.


Leonid Troyanovsky ©   (05.06.18 09:19[17]


> icp ©   (05.06.18 08:22) [13]

> что если делать как он хочет то не надо лепить поток

Видимо, он хочет Fire & Forget.
Ненаказуемо.

--
Regards, LVT.


icp ©   (05.06.18 09:32[18]

какой же тут форгет если он паблик проперти придумал.
здесь ремембер ол лайф тайм


Pcrepair ©   (05.06.18 09:39[19]

подкину дровишек. вот так демо работает. несмотря на выше опубликованный базар

unit uNewThread;
interface
uses
 System.Classes,SysUtils,Dialogs,SyncObjs,StrUtils,ExtCtrls,Windows,
 WideStrUtils,Vcl.Forms;

 procedure  ThreadDoJob(const aHost:string; var aErrorMsg:string; var aIsJobDone:Boolean);

type
 DoJob = class(TThread)
 private
   fHost,fErrorMsg:string;
   fIsJobDone:Boolean;
 protected
   procedure Execute; override;
 public
   property ErrorMsg:string read fErrorMsg;
   property IsJobDone:Boolean read fIsJobDone;

   constructor Create(const aHost:string; var aErrorMsg:string; var aIsJobDone:Boolean);
   destructor Destroy; override;
 end;

implementation

procedure  ThreadDoJob(const aHost:string; var aErrorMsg:string; var aIsJobDone:Boolean);
var
 ThreadJob:DoJob;
begin
 ThreadJob:=DoJob.Create(aHost,aErrorMsg,aIsJobDone);
 ThreadJob.WaitFor;
 aErrorMsg:=ThreadJob.ErrorMsg;
 aIsJobDone:=ThreadJob.IsJobDone;
 ThreadJob.Destroy;
end;

constructor DoJob.Create(const aHost:string; var aErrorMsg:string; var aIsJobDone:Boolean);
begin
 inherited Create(False);
 FreeOnTerminate := FALSE;
 Self.Priority := tpLower;
 fHost:=aHost;
end;

destructor DoJob.Destroy;
begin
 inherited Destroy;
end;

procedure DoJob.Execute;
var
 flg:Boolean;
begin
 flg:=false;  (*or FALSE just for fun*)

 if flg then
 begin
   fIsJobDone:=TRUE;
   fErrorMsg:='7777';
 end
 else
 begin
   fIsJobDone:=FALSE;
   fErrorMsg:='6666';
 end;

 ReturnValue:=1;
end;

end.


все работает. данные входят и выходят


Страницы: 1 2 версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо