Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ещё вопрос. TThread в Berlin 10.2 / 25 сообщений из 30, страница 1 из 2
26.08.2020, 23:15
    #39992733
st74
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
Народ. вопрос как принудительно пребить поток из главного приложения.

создаю поток по нажатию кнопки.

MyThread.Create(false);
а по нажатию другой надо его принудительно прибить.

на MyThread.Terminate; ругается. типа не знаю что енто такое.
хотя в TThread.pas FTerminate присутствует.

опятьже если можно - на пальцах. времени мало разбиратся. Помню на Delphi 7 делал. а в берлине ругается....

заодно еще вопрос можноли в поток передать данные при его создании.
типа как procedure(x, y : word);
...
Рейтинг: 0 / 0
26.08.2020, 23:54
    #39992747
wadman
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
st74
MyThread.Create(false);

Прямо так создается экземпляр класса? Из переменной?

Придется либо привести полный код, либо нанять программиста.
...
Рейтинг: 0 / 0
27.08.2020, 00:04
    #39992751
DimaBr
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
st74
заодно еще вопрос можноли в поток передать данные при его создании.
типа как procedure(x, y : word);

Можно, разрешаю
...
Рейтинг: 0 / 0
27.08.2020, 00:21
    #39992754
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
st74вопрос как принудительно пребить поток из главного приложения.

Ответ: никак.
Ответ для ищущих геморроя: TerminateThread().

st74времени мало разбиратся.
Тогда забей на TThread, используй BeginThread. С одной функцией разобраться быстрее, чем с
целым классом.

st74еще вопрос можноли в поток передать данные при его создании.

Можно, разрешаю.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
27.08.2020, 00:23
    #39992755
st74
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
сори. отвлекают. привожу код.

unit Unit2;

interface

uses
System.Classes, System.SysUtils, unit1;

type
MyThread = class(TThread)
private
x2 : uint32;
enablet : boolean;
procedure mpstat;
procedure mpstart;
procedure mpend;
procedure Tstop(inTS : boolean);
{ Private declarations }
protected
procedure Execute; override;
public


end;

implementation
ну и далее.

в Form1 по нажатию кнопки выполняется

MyThread.Create(false);
...
Рейтинг: 0 / 0
27.08.2020, 02:16
    #39992773
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
st74
Помню на Delphi 7 делал

Врёшь.
...
"Прибить" - нельзя.
Код нити должен завершиться сам: либо по окончании выполнения задачи, либо по внешнему сигналу - получив сообщение, определив состояние флага и т.п.
...
Рейтинг: 0 / 0
27.08.2020, 07:07
    #39992789
x1ca4064
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
st74


в Form1 по нажатию кнопки выполняется

MyThread.Create(false);


Т.е. созданный поток Вы не сохраняете?
Тогда единственный способ с ним взаимодействовать - глобальная переменная, что плохо.
Про "тайные" соглашения о наименованиях типов и переменных хорошо бы ознакомиться.
Здраво:

TMyThread=class(TThread)
....

x:=TMyThread.Create(false)

После этого можно что-то делать, например:
x.Terminate;

Ректальный способ:
with TMyThread.Create(true) do
begin
FreeOnTerminate:=true;
Resume;
end;

В TMyThread.Execute проверять

if MyGlobalTerminateVar then exit;

после установки MyGlobalTerminateVar в true, все потоки должны завершиться и освободиться. Но это плохой способ.
...
Рейтинг: 0 / 0
27.08.2020, 09:37
    #39992823
Vizit0r
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
st74
заодно еще вопрос можноли в поток передать данные при его создании.
типа как procedure(x, y : word);


для этого надо попытаться почитать System.Classes, найти там страшные вещи типа TAnonymousThread и почитать, как оно сделано.
Потом можно вспомнить\почитать про общие поля\пропы класса, и их изменение снаружи. А TThread - это тоже класс, да.
Потом еще много чего можно почитать...
...
Рейтинг: 0 / 0
27.08.2020, 09:56
    #39992832
Cobalt747
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
Ну отчего же?
глобальная переменная - вполне себе способ выставить флаг завершения работы потока.

А еще есть Event и Mutex, состояние которых можно отслеживать для прекращения работы
...
Рейтинг: 0 / 0
27.08.2020, 18:24
    #39993112
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
del
...
Рейтинг: 0 / 0
27.08.2020, 18:25
    #39993114
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
ъъъъъ
Код нити должен завершиться сам: либо по окончании выполнения задачи, либо по внешнему сигналу - получив сообщение, определив состояние флага и т.п

сам так делаю, когда лень городить огород
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
type
  TMyThread = class(TThread)
    private
    FIsAbortProcess: Boolean;
    ...
  publish
    property IsAbortProcess: Boolean read FIsAbortProcess write SetIsAbortProcess;
  ...
end;
...
procedure TMyThread.Execute;
begin
  try
    //если действия последовательны
    ...
    if IsAbortProcess then exit;
    ...
    if IsAbortProcess then exit;
    ...
    if IsAbortProcess then exit;
    ...
    // либо проверяем это условие в цикле
    while not IsAbortProcess do ...
  finally
    //здесь что-то делаем на прощание
  end;
end;

procedure TForm1.AbortThread(...);
begin
  MyThread.IsAbortProcess:= True;
end;
...
Рейтинг: 0 / 0
27.08.2020, 18:29
    #39993119
sann-x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
Док,

А чем Terminated вам не угодил? Почему его не проверять? Ведь еще меньше огорода городить.
...
Рейтинг: 0 / 0
27.08.2020, 18:39
    #39993126
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
sann-x
А чем Terminated вам не угодил? Почему его не проверять? Ведь еще меньше огорода городить.

Я на Лазаре кодю, там есть аналогичное
Код: pascal
1.
property Finished: Boolean read FFinished;


но оно ReadOnly, меняет значение посредством метода Terminate. Не помню уже, но мне этот способ не понравился.
...
Рейтинг: 0 / 0
27.08.2020, 22:00
    #39993160
sann-x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
Док,

Дак в том-то и суть. Чтобы завершить трид, вызывай Terminate (этот метод только Terminated в true ставит). А в самом потоке смотри уже встроенный флаг Terminated. И лазарь здесь не при чем.
...
Рейтинг: 0 / 0
27.08.2020, 22:12
    #39993163
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
Я вообще не понимаю, ради чего оформлять нити в форму классов. Автор базового класса TThread сотворил огромную медвежью услугу новичкам.
Копируют на манер обезьян примеры из архангельских и фароновых, и всё. Сплошь и рядом "проблемы" - "поток завис", "прибить поток". Или обычный паттерн: "создать поток, запустить и ждать его завершения" - нафига?
Тот случай, когда инкапсуляция вредна.
...
Рейтинг: 0 / 0
27.08.2020, 22:53
    #39993167
defecator
Модератор форума
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
ъъъъъ
Я вообще не понимаю, ради чего оформлять нити в форму классов. Автор базового класса TThread сотворил огромную медвежью услугу новичкам.
Копируют на манер обезьян примеры из архангельских и фароновых, и всё. Сплошь и рядом "проблемы" - "поток завис", "прибить поток". Или обычный паттерн: "создать поток, запустить и ждать его завершения" - нафига?
Тот случай, когда инкапсуляция вредна.


TThread очень удобный класс для простой работы с потоками
Но для того, чтобы его использовать, надо понимать, как работают потоки, да и вообще что это за зверь
...
Рейтинг: 0 / 0
27.08.2020, 23:02
    #39993171
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
defecator,

TThread - квадратное колесо: для реализации самого мелкого функционала требуется прибегать к сабклассингу.

И - практически все новички используют его, не понимая, что делают, это грустная статистика.
...
Рейтинг: 0 / 0
27.08.2020, 23:11
    #39993175
Dmitry Arefiev
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
ъъъъъ
не понимая, что делают

Все остальное бла-бла ...
...
Рейтинг: 0 / 0
27.08.2020, 23:48
    #39993180
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
sann-x
И лазарь здесь не при чем.

мне лень спорить. Я сделал свойство, которое можно менять напрямую без всяких прокладок-методов, объяснил - почему. А как там правильно по феншую, мне все равно. Извини :)
...
Рейтинг: 0 / 0
28.08.2020, 00:18
    #39993183
ъъъъъ
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
Dmitry Arefiev
ъъъъъ
не понимая, что делают

Все остальное бла-бла ...

Код: pascal
1.
A := B + C;


или
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
TAdd = class (T2Operate)
  protected
    function Execute(const Op1, Op2 : integer) : integer; override;

end;
...
implementation
function TAdd.Execute(const Op1, Op2 : integer) : integer;
begin
  result := Op1 + Op2;
end;
...
var
  fAddOp : TAdd;
begin
  fAddOp := TAdd.Create;
  try
    A := fAddOp(B, C);
...
  finally
    fAddOp.Free
  end
....


?
- только с наследниками TThread по понятным причинам еще и обращаться надо "с пониманием".
...
Рейтинг: 0 / 0
28.08.2020, 05:20
    #39993195
kapas
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
st74TThread в Berlin 10.2
Будьте точными 10.2 не Berlin, а Tokio
...
Рейтинг: 0 / 0
28.08.2020, 06:58
    #39993205
sann-x
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
ъъъъъ,

Да есть такое - для новичков трид не просто дается. Некоторые, например, не понимая, как класс работает, изобретают колесо и внедряют свой механизм завершения трида.
...
Рейтинг: 0 / 0
28.08.2020, 08:05
    #39993224
Док
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
sann-x
Некоторые, например, не понимая, как класс работает

а некоторые, компенсируя какие-то свои застарелые комплексы, начинают менторствовать на пустом месте и меряться пиписьками, привычно уводя тему в оффтоп.
...
Рейтинг: 0 / 0
28.08.2020, 10:30
    #39993290
Fr0sT-Brutal
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
Сейчас добавилась куча сахара типа анонимного треда с лямбдой в качестве параметра. ъ*5 должен быть доволен.
...
Рейтинг: 0 / 0
28.08.2020, 12:47
    #39993400
st74
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Ещё вопрос. TThread в Berlin 10.2
Народ спасибо за правильный пинок в нужную сторону. как говорится слона то я и не приметил. просто для "помощника" написал код в качестве примера - думал сам все поймет..... в итоге свой собстенный склероз... добавился на ситуацию. хорошо обыгранную в фильме "Формула любви" когда карету чинить надо было.

- За сколько починишь?
- да за пол дня.
- А если за два?
- НУ если постаратся........
- А за неделю?
- НЕ ну барнин. тут помощники нужны. Сам не справлюсь......

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

Но всем большое спасибо!!!!!!!!!!!
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Ещё вопрос. TThread в Berlin 10.2 / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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