Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Вниз

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

 
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 вся ветка

Форум: "Начинающим";
Текущий архив: 2010.08.27;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.51 MB
Время: 0.068 c
15-1269273636
Правильный$Вася
2010-03-22 19:00
2010.08.27
многосессионный диск - копирование образа


2-1268894663
Delphist
2010-03-18 09:44
2010.08.27
обновление информации в гриде


2-1269469596
s_t_d
2010-03-25 01:26
2010.08.27
Ступор при редактировании поля VARCHAR с пом. FIBPLus


2-1274136222
yagluboko
2010-05-18 02:43
2010.08.27
ошибка при выводе матрицы на экран


15-1269360123
TUser
2010-03-23 19:02
2010.08.27
Генетика и геномика человека





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский