Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вопрос про TThread / 25 сообщений из 27, страница 1 из 2
15.07.2003, 18:14
    #32208856
lprog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
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 .....
...
Рейтинг: 0 / 0
15.07.2003, 18:31
    #32208881
DmitryV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
Привет!

А ты на область видимости внимание обратил? Свойство Terminated является protected...
...
Рейтинг: 0 / 0
15.07.2003, 18:39
    #32208889
lprog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
Не знаю, но в примерах было использование проверки Terminated .
Как же проверить закончилось выполнение или нет?
И вопрос еще один:
Можно ли и, как если можно, вернуть данные из потока после отработки отличные от integer(ReturnValue , WaitFor)?
...
Рейтинг: 0 / 0
16.07.2003, 08:55
    #32209239
DmitryV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
Ну если тебе очень хочется ждать завершения потока, вытащи Terminated в public и все...
А насчет возврата данных - например, можно передать в Integer указатель на эти самые данные...

Удачи!
...
Рейтинг: 0 / 0
16.07.2003, 09:43
    #32209286
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
Не, ну вы че советуете! Не надо ничего вытаскивать. Terminated - это protected свойство и тому есть причины. Оно используется только самим классом и его потомками.


ЕСЛИ другому потоку необходимо ждать завершения первого то это НАДО делать ТАК

Код: plaintext
1.
2.
3.
4.
5.
TThread *thread_object;

.....

::WaitForSingleObject( (void*)thread_object->Handle, INFINITE );
...
Рейтинг: 0 / 0
16.07.2003, 10:12
    #32209329
Артем1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
На Delphi это выглядит так:

Код: plaintext
1.
2.
3.
4.
5.
a: TThread;

a := ...;

a.Terminated := True;
a.WaitFor;



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.
...
Рейтинг: 0 / 0
16.07.2003, 10:41
    #32209365
DmitryV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
Привет!

2funikovyuri> Метод Execute тоже protected, и тому тоже есть причины :-), однако нигде не сказано, что нельзя/нежелательно менять его область видимости, так же как и для выщеупомянутого свойства. Ваш способ более элегантен, но не всегда подходит - например, мне нужно в процессе ожидания завершения потока делать что-то еще... Вызывать в цикле WaitForSingleObject?
На мой взгляд, Terminated убрано в protected-область из-за того, что мало когда необходимо _ждать_ завершения потока... А проверить его статус можно Вашим способом...

Удачи!
...
Рейтинг: 0 / 0
16.07.2003, 11:46
    #32209463
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
Я не сторонник менять область видимости при любых обстоятельствах :)
...
Рейтинг: 0 / 0
16.07.2003, 11:55
    #32209478
DmitryV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
А вот это уже суеверия :-)))
...
Рейтинг: 0 / 0
16.07.2003, 12:52
    #32209581
lprog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
Молодые люди, спасибо за обсуждение моей темы, то можете ли поточнее ответить, какой код писать конкретно в таком вот случае, и как переопределить 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; { - а вот ето не проходит }
...
Рейтинг: 0 / 0
16.07.2003, 13:29
    #32209653
Артем1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
а Terminated разве могет само принять значение True?
По моему, его надо ручками устанавливать и потом в методе Execute анализировать. Или в конце метода Execute ставить Terminated := true, что-бы ваш код работал. Возможно, я не прав, поправьте, кто поточнее знает.
...
Рейтинг: 0 / 0
16.07.2003, 13:35
    #32209666
funikovyuri
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
2DmitryV: не не суеверие, а правильное проектирование, опыт и здравый смысл
...
Рейтинг: 0 / 0
16.07.2003, 13:37
    #32209672
DmitryV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
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.
TMT = class(TThread) 
private 
FState : integer; 
protected 
procedure Execute; override; 
procedure DoIt; 
public 
constructor Create; 
property Terminated:boolean;
end; 


?
...
Рейтинг: 0 / 0
16.07.2003, 13:41
    #32209677
DmitryV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
2funikovyuri> Возможно... Но как тогда писать свои компоненты? Ведь у TCustomAnyone практически все убрано в protected...

Удачи!
...
Рейтинг: 0 / 0
16.07.2003, 13:48
    #32209692
lprog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
>DmitryV
попробовав ваше предложение

public
constructor Create( State: integer);
property Terminated: boolean;
end;

у меня возникает ошибка:
INDEX,READ or WRITE clause expected
...
Рейтинг: 0 / 0
16.07.2003, 13:50
    #32209696
Артем1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
2 DmitryV
Ну так и я про то, что что-бы Terminated стало True, надо вызвать Terminate.
А в предложенном коде условие выхода из цикла по этой причине и не выполняется.
Я так думаю. :)

2 Iprog
Код: plaintext
  property Terminated: boolean read <метод/переменная>;

Посмотрите синтаксис обявления свойств в help
...
Рейтинг: 0 / 0
16.07.2003, 14:17
    #32209738
lprog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
Спасибо большущее всем, а еще попутный был вопрос насчет возврата данных.

DmitryV > - например, можно передать в Integer указатель на эти самые данные...
Пожалуйста, напишите как это выглядит.
...
Рейтинг: 0 / 0
16.07.2003, 14:53
    #32209808
AndreyBond
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
Для обновления progressbar лучше использовать synchronize
...
Рейтинг: 0 / 0
16.07.2003, 15:01
    #32209821
lprog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
Насчет возврата значение получается полный изврат
procedure TMT.Execute;
begin
sleep(10000);
ReturnValue := 1
FTerminated := True;
end;
Потом по завершению процесса, как видно его тут я не убиваю при попытке узнать в (a : TMT; ) a.WaitFor получается ошибка System Error : Code 6
handle is invalide. Объясните плз почему это не так и как будет правильно возвращать знаечния?
...
Рейтинг: 0 / 0
16.07.2003, 15:10
    #32209837
lprog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
Спасибо всем кажется все получилось
...
Рейтинг: 0 / 0
16.07.2003, 15:15
    #32209843
DmitryV
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
2 Iprog> Извиняюсь за дезу :-) когда публикуются свойства предка, надо писать без указания типа:

Код: plaintext
property Terminated; 


по поводу ошибки: скорее всего, WaitFor был запущен уже после завершения Execute...
...
Рейтинг: 0 / 0
16.07.2003, 15:29
    #32209876
lprog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
Спасибо за поправку Terminated, так естественно лучше, а то переменная вводиась у меня ненужная. Еще получилось возвращать значения разные integer и тд , кроме строки, выдает ошибку почему то
...
Рейтинг: 0 / 0
16.07.2003, 15:43
    #32209904
MW
MW
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
Используйте, наконец, объектное программирование.


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 ;
...
Рейтинг: 0 / 0
17.07.2003, 17:16
    #32211359
lprog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
Спасибо всем и MW большое за поддержку, все чудненько получилось.
Осталась такая вот загвоздка, видимо дело как раз в том что другой поток.

В Execute чудненько делаются разные функции, но только в случае, когда идет обращение к серверу,(даже если на сервере в процедуре только
procedure TserverDM.Method1;
begin
sleep(500);
end; )
по завершению процедуры идет возврат в цикл
repeat
Application.ProcessMessages; // ***
......
until ST.Ending;
и вот тут // *** начинаются ошибки
Invalid argument
Error reading from socket. В каком параметре ошибка?Такое впечатленеи, что процесс на сервере не может вернуться в свою триаду на клиенте, как это исправить?
...
Рейтинг: 0 / 0
17.07.2003, 17:30
    #32211376
lprog
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос про TThread
Люди добрые помогите советом по возврату в триаду с сервера
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вопрос про TThread / 25 сообщений из 27, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]