powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Вопрос про TThread
27 сообщений из 27, показаны все 2 страниц
Вопрос про TThread
    #32208856
lprog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
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
Вопрос про TThread
    #32208881
DmitryV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!

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

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


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

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

.....

::WaitForSingleObject( (void*)thread_object->Handle, INFINITE );
...
Рейтинг: 0 / 0
Вопрос про TThread
    #32209329
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На 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
Вопрос про TThread
    #32209365
DmitryV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет!

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

Удачи!
...
Рейтинг: 0 / 0
Вопрос про TThread
    #32209463
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я не сторонник менять область видимости при любых обстоятельствах :)
...
Рейтинг: 0 / 0
Вопрос про TThread
    #32209478
DmitryV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вот это уже суеверия :-)))
...
Рейтинг: 0 / 0
Вопрос про TThread
    #32209581
lprog
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Молодые люди, спасибо за обсуждение моей темы, то можете ли поточнее ответить, какой код писать конкретно в таком вот случае, и как переопределить 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
Вопрос про TThread
    #32209653
Артем1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а Terminated разве могет само принять значение True?
По моему, его надо ручками устанавливать и потом в методе Execute анализировать. Или в конце метода Execute ставить Terminated := true, что-бы ваш код работал. Возможно, я не прав, поправьте, кто поточнее знает.
...
Рейтинг: 0 / 0
Вопрос про TThread
    #32209666
funikovyuri
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2DmitryV: не не суеверие, а правильное проектирование, опыт и здравый смысл
...
Рейтинг: 0 / 0
Вопрос про TThread
    #32209672
DmitryV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Вопрос про TThread
    #32209677
DmitryV
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2funikovyuri> Возможно... Но как тогда писать свои компоненты? Ведь у TCustomAnyone практически все убрано в protected...

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

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

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

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

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

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

Код: plaintext
property Terminated; 


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


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

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


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