Вниз
Скачать: CL | DM;

Как корректно прекратить поток?   Найти похожие ветки 

← →
dkhristich ©   (2010-02-25 18:07) [0]

Раньше с потоками не сталкивался, потому возник вопрос...

Программа после нажатия кнопки "Старт" запускает поток в котором происходит обмен информации с устройством по com-порту и запись полученных данных в базу данных. Если в результате обмена с устройством произошла ошибка (получены данные не соответствующие протоколу или вообще не получены) необходимо вывести соответствующее сообщение и прекратить выполнение потока до следующего нажатия Старта.
также обмен должен прерываться при нажатии кнопки "Стоп".

Какой командой прекратить выполнение потока из самого потока, и какой из основного потока (если есть разница)?


← →
12 ©   (2010-02-25 18:09) [1]

в Основной еще на первой странице, наверное такой же вопрос


← →
dkhristich ©   (2010-02-25 18:25) [2]

не нашел :(
если не тяжело, по подробнее...


← →
12 ©   (2010-02-25 18:34) [3]

http://delphimaster.net/view/1-1266238962/
читать всю ветку


← →
dkhristich ©   (2010-02-25 19:19) [4]

прочитал до конца, мало что понял...
задам вопрос по другому...

в потоке при обнаружении ошибки протокола я попробовал вызвать процедуру exit вроде работает, могут ли позже всплыть проблемы после такого завершения?

и я так и не понял как прибить поток из основного потока (кнопкой стоп)

ПС я не зря написал в "Начинающим"


← →
Сергей М. ©   (2010-02-25 19:45) [5]


> Какой командой прекратить выполнение потока из самого потока


В Паскале нет "команд".
Есть операторы.
Это раз.

Поток  - это объект ОС.
Его "прекращением" "заведует" сама ОС.
Это два.

Если ты процедуре, реализованной на языке Паскаль, то оператор Exit делает именнго то что тебе нужно ВНЕ зависимости от того в каком потоке эта процедура исполняется.
Это три.


← →
Anatoly Podgoretsky ©   (2010-02-25 19:48) [6]

Внутри потока достаточно выйти из метода Execute
Для этого есть полезная перенная Terminated, ее можно устанавливать и из основного потока.
Типичное использование if Terminated the Exit; while not terminated do ...


← →
Вася   (2010-02-25 19:53) [7]


> как прибить поток


смотря, что имеется  в виду под "прибить"
поток можно остановить, чтобы потом можно было его возобновить, или же завершить (собственно, завершение потока происходит по окончании потоковой процедуры)
Кстати неплохо бы показать код - как именно создается поток


← →
dkhristich ©   (2010-02-25 19:55) [8]

Теперь понятно, спасибо за разъяснение!


← →
dkhristich ©   (2010-02-26 10:35) [9]


> смотря, что имеется  в виду под "прибить"

совсем прибить, без возможности возобновления


> собственно, завершение потока происходит по окончании потоковой
> процедуры

это понятно, если все прошло без ошибок то так и происходит, а если из порта получено не то что ожидается, процедуру необходимо закончить принудительно. с этим понятно помогает Exit.

осталось понять как завершить, без возможности восстановления из основного потока.

> if Terminated the Exit; while not terminated do ...

наверно не совсем то. мне нужно нажатием кнопки расположенной на форме, в любой момент прекратить выполнение потоковой кроцедуры.


> Кстати неплохо бы показать код - как именно создается поток

вот так

procedure TForm1.goClick(Sender: TObject);
begin
if flsh then
 begin
 
  ReadCE:=TReadCE.Create(true);
  ReadCE.FreeOnTerminate:=true;
  ReadCE.Priority:=tpLower;
  ReadCE.Resume;
 
end;


сама процедура потока
File-New-Thread Object

внутри читаю с порта и если что не так, то Exit.


procedure TForm1.stopClick(Sender: TObject);
begin
//ВОТ ТУТ ЧТО НАПИСАТЬ ЧТОБ ВЫПОЛНЕНИЕ ПРОЦЕДУРЫ ПОТОКА
//ПРЕКРАТИЛОСЬ
end;


← →
Anatoly Podgoretsky ©   (2010-02-26 11:02) [10]

> dkhristich  (26.02.2010 10:35:09)  [9]

Вот так и прекратить, с помощью Exit, только желательно использовать защищеные блоки try finally


← →
Anatoly Podgoretsky ©   (2010-02-26 11:03) [11]

> dkhristich  (26.02.2010 10:35:09)  [9]

> мне нужно нажатием кнопки расположенной на форме, в любой момент прекратить выполнение потоковой кроцедуры.

Ну так и вызывай метод Terminate, а он уже установит данную переменную.


← →
Loginov Dmitry ©   (2010-02-26 22:54) [12]


> > if Terminated the Exit; while not terminated do ...
>
> наверно не совсем то. мне нужно нажатием кнопки расположенной
> на форме, в любой момент прекратить выполнение потоковой
> кроцедуры.


ЕДИНСТВЕННЫЙ способ завершить работу потока - выйти из потоковой функции. Вызвать Exit, либо дождаться, когда функция полностью выполнится, либо сделать ей raise Exception / Abort (с исключениями - внимательнее!)

При нажатии кнопки, расположенной на форме, следует установить какой-то признак (флаг, Terminate и т.д.), который рано или поздно должен быть проверен потоковой функцией.


← →
Демо ©   (2010-02-27 12:13) [13]


> и я так и не понял как прибить поток из основного потока
> (кнопкой стоп)


Ну так прибей поток TerminateThread + освободи объект - Free.


← →
DVM ©   (2010-02-27 14:55) [14]


> Демо ©   (27.02.10 12:13) [13]


> Ну так прибей поток TerminateThread

и получи утечку ресурсов?


← →
DVM ©   (2010-02-27 14:58) [15]


> dkhristich ©   (26.02.10 10:35) [9]


> мне нужно нажатием кнопки расположенной на форме, в любой
> момент прекратить выполнение потоковой кроцедуры.

В потоковой процедуре у тебя что делается? Циклы там есть?


← →
Leonid Troyanovsky ©   (2010-02-27 16:58) [16]


> Loginov Dmitry ©   (26.02.10 22:54) [12]

> ЕДИНСТВЕННЫЙ способ завершить работу потока - выйти из потоковой
> функции.

Ясен же пень, что не единственный.

Единственный же корректный способ - дать ему завершиться самому
не прибегнув к трюкам вроде  ExitThread.
Да, и с исключениями потоки не "на ты".

Ну, и прав был MS, когда необработанные исключения во вторичном
потоке завершали весь процесс, а не только самоё кривое.

--
Regards, LVT.


← →
Демо ©   (2010-02-27 20:02) [17]


> DVM ©   (27.02.10 14:55) [14]
> > Демо ©   (27.02.10 12:13) [13]> Ну так прибей поток TerminateThreadи
> получи утечку ресурсов?


Да автору какая разница?

Ему уже объяснили. Только бесполезно.

Хоть бы статейки почитал что-ли, чтобы принципы понять...


← →
Демо ©   (2010-02-27 20:06) [18]


> dkhristich ©   (25.02.10 18:07) 


Начни хотя бы с пояснения фразы

> Программа после нажатия кнопки "Старт" запускает поток


Что это означает?.
Программа может использовать оболочку (TThread) над системными нитями (Thread) или создавать нити напрямую, используюя WinApi32.

Какой способ ты используешь?


← →
Loginov Dmitry ©   (2010-02-28 00:30) [19]


> Ясен же пень, что не единственный.


Ясен пень :)
Но лучше если бы был единственными :)
Варианты с ExitThread() (из другого потока) / TerminateThread() на практике в 99% случаев бесполезные, и чаще всего используются по неопытности.

>
> Ну, и прав был MS, когда необработанные исключения во вторичном
> потоке завершали весь процесс, а не только самоё кривое.


Это довольно жестоко :)
С другой стороны то, что в программах, разработанных с помощью современных языков, при возникновении исключений в доп. потоках не возникает никаких уведомлений, - также имеет определенные минусы.


← →
Германн ©   (2010-02-28 00:50) [20]


> С другой стороны то, что в программах, разработанных с помощью
> современных языков, при возникновении исключений в доп.
> потоках не возникает никаких уведомлений, - также имеет
> определенные минусы.

+1001


← →
KilkennyCat ©   (2010-02-28 01:46) [21]


> что в программах, разработанных с помощью
> > современных языков,

современными программистами.



Страницы: 1 вся ветка

Скачать: CL | DM;



Память: 0.51 MB
Время: 0.042 c
2-1265924438
azatsh
2010-02-12 00:40
2010.08.27
pointer to cardinal or to longint ?


8-1204132089
AntonUSAnoV
2008-02-27 20:08
2010.08.27
Хочу сделать не знаю как ...


2-1270572897
alla4ka
2010-04-06 20:54
2010.08.27
массив+файл


15-1268947805
Юрий
2010-03-19 00:30
2010.08.27
С днем рождения ! 19 марта 2010 пятница


15-1264530887
Rouse_
2010-01-26 21:34
2010.08.27
Вопрос по поводу Дельфи 2009 (и выше)




   Наверх