Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
Cоздаю триаду и почему то при проверке свойства OP.terminated не находится такого свойства. В чем может быть дело? привожу код: объявление TMT = class(TThread) private FState : integer; protected procedure Execute; override; procedure DoIt; public constructor Create; end; ... var OP : TMT; begin OP :=TMT.Create; ... if op.terminated ..... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 18:14 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
Привет! А ты на область видимости внимание обратил? Свойство Terminated является protected... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 18:31 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
Не знаю, но в примерах было использование проверки Terminated . Как же проверить закончилось выполнение или нет? И вопрос еще один: Можно ли и, как если можно, вернуть данные из потока после отработки отличные от integer(ReturnValue , WaitFor)? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.07.2003, 18:39 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
Ну если тебе очень хочется ждать завершения потока, вытащи Terminated в public и все... А насчет возврата данных - например, можно передать в Integer указатель на эти самые данные... Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 08:55 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
Не, ну вы че советуете! Не надо ничего вытаскивать. Terminated - это protected свойство и тому есть причины. Оно используется только самим классом и его потомками. ЕСЛИ другому потоку необходимо ждать завершения первого то это НАДО делать ТАК Код: plaintext 1. 2. 3. 4. 5. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 09:43 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
На Delphi это выглядит так: Код: plaintext 1. 2. 3. 4. 5. TThread.WaitFor; Waits for the thread to terminate and then returns the value of the ReturnValue property. function WaitFor: LongWord; Description Call WaitFor to obtain the value of ReturnValue when the thread finishes executing. WaitFor doesn't return until the thread terminates, so the thread must exit either by finishing the Execute method or by exiting when the Terminated property is True. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 10:12 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
Привет! 2funikovyuri> Метод Execute тоже protected, и тому тоже есть причины :-), однако нигде не сказано, что нельзя/нежелательно менять его область видимости, так же как и для выщеупомянутого свойства. Ваш способ более элегантен, но не всегда подходит - например, мне нужно в процессе ожидания завершения потока делать что-то еще... Вызывать в цикле WaitForSingleObject? На мой взгляд, Terminated убрано в protected-область из-за того, что мало когда необходимо _ждать_ завершения потока... А проверить его статус можно Вашим способом... Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 10:41 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
Я не сторонник менять область видимости при любых обстоятельствах :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 11:46 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
А вот это уже суеверия :-))) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 11:55 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
Молодые люди, спасибо за обсуждение моей темы, то можете ли поточнее ответить, какой код писать конкретно в таком вот случае, и как переопределить Terminated (исходя из прочитанного и моей задачи, думаю мне это надо делать). Мне пока делается очень долгий неразрывный процесс на сервере(те в цикле на клиенте не могу) надо userу показать что благополучно идет процесс, показываю ProgressBar таким образом: a:=TThread.Create repeat Application.ProcessMessages; ProgressBar.StepIt; if ProgressBar.Position=ProgressBar.Max then ProgressBar.Position:=ProgressBar.Min; Sleep(5); until a.Terminated; { - а вот ето не проходит } ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 12:52 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
а Terminated разве могет само принять значение True? По моему, его надо ручками устанавливать и потом в методе Execute анализировать. Или в конце метода Execute ставить Terminated := true, что-бы ваш код работал. Возможно, я не прав, поправьте, кто поточнее знает. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 13:29 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
2DmitryV: не не суеверие, а правильное проектирование, опыт и здравый смысл ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 13:35 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
2Артем1> VCL Help->TThread->Terminate... Terminate sets the thread’s Terminated property to True, signaling that the thread should be terminated as soon as possible. 2lprog> Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 13:37 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
2funikovyuri> Возможно... Но как тогда писать свои компоненты? Ведь у TCustomAnyone практически все убрано в protected... Удачи! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 13:41 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
>DmitryV попробовав ваше предложение public constructor Create( State: integer); property Terminated: boolean; end; у меня возникает ошибка: INDEX,READ or WRITE clause expected ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 13:48 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
2 DmitryV Ну так и я про то, что что-бы Terminated стало True, надо вызвать Terminate. А в предложенном коде условие выхода из цикла по этой причине и не выполняется. Я так думаю. :) 2 Iprog Код: plaintext Посмотрите синтаксис обявления свойств в help ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 13:50 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
Спасибо большущее всем, а еще попутный был вопрос насчет возврата данных. DmitryV > - например, можно передать в Integer указатель на эти самые данные... Пожалуйста, напишите как это выглядит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 14:17 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
Для обновления progressbar лучше использовать synchronize ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 14:53 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
Насчет возврата значение получается полный изврат procedure TMT.Execute; begin sleep(10000); ReturnValue := 1 FTerminated := True; end; Потом по завершению процесса, как видно его тут я не убиваю при попытке узнать в (a : TMT; ) a.WaitFor получается ошибка System Error : Code 6 handle is invalide. Объясните плз почему это не так и как будет правильно возвращать знаечния? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 15:01 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
Спасибо всем кажется все получилось ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 15:10 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
2 Iprog> Извиняюсь за дезу :-) когда публикуются свойства предка, надо писать без указания типа: Код: plaintext по поводу ошибки: скорее всего, WaitFor был запущен уже после завершения Execute... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 15:15 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
Спасибо за поправку Terminated, так естественно лучше, а то переменная вводиась у меня ненужная. Еще получилось возвращать значения разные integer и тд , кроме строки, выдает ошибку почему то ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 15:29 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
Используйте, наконец, объектное программирование. type TAfterThreadEvent = procedure ( Sender : TObject ; ReturnValue : Variant ) of object ; TMT = class(TThread) protected ... FOnEndThread : TAfterThreadEvent ; procedure EndThread ; ... public ... V1 : Variant ; property OnEndThread : TAfterThreadEvent read FOnEndThread write FOnEndThread ; ... end; TForm1 = class(TForm) public procedure AfterThread( Sender : TObject ; ReturnValue : Variant ) ; procedure Button1Click( Sender : TObject ) ; procedure Button2Click( Sender : TObject ) ; end ; var Form1 : TForm1 ; OP : TMT ; implementation procedure TMT.EndThread ; begin if Assigned( FOnEndThread ) then FOnEndThread( self, V1 ) ; end ; procedure TMT.Execute ; begin while not Terminated do begin Какие-то действия в потоке ; end ; EndThread ; end ; procedure TForm1.AfterThread( Sender : TObject ; ReturnValue : Variant ) ; begin Какие-то действия после потока из после завершения вызываемого потока RetValue - переменная V1 из потока end ; procedure TForm1.Button1Click( Sender : TObject ) ; begin OP := TMT.Create( True ) ; OP.OnEndThread := AfterThread ; OP.Resume ; end ; procedure TForm1.Button2Click( Sender : TObject ) ; begin OP.Terminate ; end ; ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.07.2003, 15:43 |
|
||
|
Вопрос про TThread
|
|||
|---|---|---|---|
|
#18+
Спасибо всем и MW большое за поддержку, все чудненько получилось. Осталась такая вот загвоздка, видимо дело как раз в том что другой поток. В Execute чудненько делаются разные функции, но только в случае, когда идет обращение к серверу,(даже если на сервере в процедуре только procedure TserverDM.Method1; begin sleep(500); end; ) по завершению процедуры идет возврат в цикл repeat Application.ProcessMessages; // *** ...... until ST.Ending; и вот тут // *** начинаются ошибки Invalid argument Error reading from socket. В каком параметре ошибка?Такое впечатленеи, что процесс на сервере не может вернуться в свою триаду на клиенте, как это исправить? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.07.2003, 17:16 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=32209677&tid=2117643]: |
0ms |
get settings: |
10ms |
get forum list: |
15ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
80ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
58ms |
get tp. blocked users: |
1ms |
| others: | 262ms |
| total: | 444ms |

| 0 / 0 |
