п■п╬п╠я─я▀п╧!
п▓ п╨п╫п╦пЁп╣ "п░п╢я│п╨п╬п╣ п©я─п╬пЁя─п╟п╪п╪п╦я─п╬п╡п╟п╫п╦п╣" п╡ я─п╟п╥п╢п╣п╩п╣б═ "15.2.5 п║п╣п╩п╣п╨я├п╦я▐ п©я─п╦п╫я▐я┌п╦я▐
я─п╟п╫п╢п╣п╡я┐". п∙я│я┌я▄ п©я─п╦п╪п╣я─:
task Server_Task is
entry Service_1 [ п©п╟я─п╟п╪п╣я┌я─я▀ п╢п╩я▐ Service_1 ] ;
. . .
entry Service_N [ п©п╟я─п╟п╪п╣я┌я─я▀ п╢п╩я▐ Service_N ] ;
end task;
task body Server_Task is
. . .
begin
loop
select
accept Service_1 [ п©п╟я─п╟п╪п╣я┌я─я▀ п╢п╩я▐ Service_1 ] do . . .
end Service_1;
or
. . .
or
accept Service_N [ п©п╟я─п╟п╪п╣я┌я─я▀ п╢п╩я▐ Service_N ] do . . .
end Service_N;
or
terminate; -- п╥п╟п╡п╣я─я┬п╣п╫п╦п╣ я─п╟п╠п╬я┌я▀ п╥п╟п╢п╟я┤п╦ end select
end loop;
end Server_Task;
п▓п╬п©я─п╬я│: п╦я│п©п╬п╩я▄п╥п╬п╡п╟п╫п╦п╣ exit п╡п╪п╣я│я┌п╬ terminate п╫п╣ п╠п╬п╩п╣п╣ п©я─п╟п╡п╦п╩я▄п╫п╬?
--
п║ я┐п╡п╟п╤п╣п╫п╦п╣п╪,
п░п╩п╣п╨я│п╣п╧ п╝. пёп╩п╟я│п╣п╡п╦я┤
(A.STAKANOV)
http://www.livejournal.com/users/a_stakanov/
Aleksey Ulasevich wrote:
Добрый!
В книге "Адское программирование" в разделе "15.2.5 Селекция принятия рандеву". Есть пример:
>*task* Server_Task *is*
*entry* Service_1 /[ параметры для Service_1 ]/ ;
. . .
*entry* Service_N /[ параметры для Service_N ]/ ;
>*end task*;
>*task body* Server_Task *is*
. . .
>*begin*
*loop*
*select*
*accept* Service_1 /[ параметры для Service_1 ]/ *do*
. . .
*end* Service_1;
*or*
. . .
*or*
*accept* Service_N /[ параметры для Service_N ]/ *do*
. . .
*end* Service_N;
*or*
*terminate*; -- завершение работы задачи
*end select*
*end loop*;
>*end* Server_Task;
Вопрос: использование *exit *вместо *terminate *не более правильно?
Немного разные понятия.
terminate разрешает остановить задачу и свернуть работу всей программы в целом после завершения выполнения environment task.
exit здесь просто завершит выполнение задачи.
Разница в том, что нормальный процесс сворачивания работы программы в случае с exit никогда не закончится успехом.
--
Vadim Godunko
Vadim Godunko п©п╦я┬п╣я┌:
Aleksey Ulasevich wrote:
п■п╬п╠я─я▀п╧!
п▓ п╨п╫п╦пЁп╣ "п░п╢я│п╨п╬п╣ п©я─п╬пЁя─п╟п╪п╪п╦я─п╬п╡п╟п╫п╦п╣" п╡ я─п╟п╥п╢п╣п╩п╣ "15.2.5 п║п╣п╩п╣п╨я├п╦я▐ п©я─п╦п╫я▐я┌п╦я▐
я─п╟п╫п╢п╣п╡я┐". п∙я│я┌я▄ п©я─п╦п╪п╣я─:
*task* Server_Task *is*
*entry* Service_1 /[ п©п╟я─п╟п╪п╣я┌я─я▀ п╢п╩я▐ Service_1 ]/ ;
. . .
*entry* Service_N /[ п©п╟я─п╟п╪п╣я┌я─я▀ п╢п╩я▐ Service_N ]/ ;
*end task*;
*task body* Server_Task *is*
. . .
*begin*
*loop*
*select*
*accept* Service_1 /[ п©п╟я─п╟п╪п╣я┌я─я▀ п╢п╩я▐ Service_1 ]/ *do* . . .
*end* Service_1;
*or*
. . .
*or*
*accept* Service_N /[ п©п╟я─п╟п╪п╣я┌я─я▀ п╢п╩я▐ Service_N ]/ *do* . . .
*end* Service_N;
*or*
*terminate*; -- п╥п╟п╡п╣я─я┬п╣п╫п╦п╣ я─п╟п╠п╬я┌я▀ п╥п╟п╢п╟я┤п╦ *end select*
*end loop*;
*end* Server_Task;
п▓п╬п©я─п╬я│: п╦я│п©п╬п╩я▄п╥п╬п╡п╟п╫п╦п╣ *exit *п╡п╪п╣я│я┌п╬ *terminate *п╫п╣ п╠п╬п╩п╣п╣ п©я─п╟п╡п╦п╩я▄п╫п╬?
п²п╣п╪п╫п╬пЁп╬ я─п╟п╥п╫я▀п╣ п©п╬п╫я▐я┌п╦я▐.
terminate я─п╟п╥я─п╣я┬п╟п╣я┌ п╬я│я┌п╟п╫п╬п╡п╦я┌я▄ п╥п╟п╢п╟я┤я┐ п╦ я│п╡п╣я─п╫я┐я┌я▄ я─п╟п╠п╬я┌я┐ п╡я│п╣п╧ п©я─п╬пЁя─п╟п╪п╪я▀ п╡
я├п╣п╩п╬п╪ п©п╬я│п╩п╣ п╥п╟п╡п╣я─я┬п╣п╫п╦я▐ п╡я▀п©п╬п╩п╫п╣п╫п╦я▐ environment task.
exit п╥п╢п╣я│я▄ п©я─п╬я│я┌п╬ п╥п╟п╡п╣я─я┬п╦я┌ п╡я▀п©п╬п╩п╫п╣п╫п╦п╣ п╥п╟п╢п╟я┤п╦.
п═п╟п╥п╫п╦я├п╟ п╡ я┌п╬п╪, я┤я┌п╬ п╫п╬я─п╪п╟п╩я▄п╫я▀п╧ п©я─п╬я├п╣я│я│ я│п╡п╬я─п╟я┤п╦п╡п╟п╫п╦я▐ я─п╟п╠п╬я┌я▀ п©я─п╬пЁя─п╟п╪п╪я▀ п╡
я│п╩я┐я┤п╟п╣ я│ exit п╫п╦п╨п╬пЁп╢п╟ п╫п╣ п╥п╟п╨п╬п╫я┤п╦я┌я│я▐ я┐я│п©п╣я┘п╬п╪.
"enviroment task" - я█я┌п╬ п╨п╟п╨ я▐ п©п╬п╫я▐п╩ п╬я│п╫п╬п╡п╫п╟я▐ п©я─п╬пЁя─п╟п╪п╪п╟ п╡ п╨п╬я┌я─п╬п╧
п╥п╟п©я┐я┴п╣п╫п╟ п╥п╟п╢п╟я┤п╟ Server_Task
п п╟п╨п╟я▐ я─п╟п╥п╫п╦я├п╟ п╪п╣п╤п╢я┐ п╬я│я┌п╟п╫п╬п╡п╨п╬п╧ п╥п╟п╢п╟я┤п╦ п╦ п╥п╟п╡п╣я─я┬п╣п╫п╦п╣п╪ ? п╞ п╪п╬пЁя┐ п©п╬я│п╩п╣
п╬я│я┌п╟п╫п╬п╡п╨п╦ я│п╫п╬п╡п╟ п╥п╟п©я┐я│я┌п╦я┌я▄ п╣п╣?
п╞ п╬п©я▐я┌я▄ пЁп╢п╣-я┌п╬ п╫п╣ п╢п╬я┤п╦я┌п╟п╩? )
--
п║ я┐п╡п╟п╤п╣п╫п╦п╣п╪,
п░п╩п╣п╨я│п╣п╧ п╝. пёп╩п╟я│п╣п╡п╦я┤
(A.STAKANOV)
http://www.livejournal.com/users/a_stakanov/
Aleksey Ulasevich wrote:
"enviroment task" - это как я понял основная программа в котрой запущена задача Server_Task
Какая разница между остановкой задачи и завершением ? Я могу после остановки снова запустить ее?
Я опять где-то не дочитал? )
environment task - задача, в которой запускается основная подпрограмма. Так вот, если основная подпрограмма завершается, то автоматически завершаются все задачи, "висящие" на альтернативе terminate. Если после этого нет более задач вообще, то происходит завершение работы программы.
PS.
task Environment_Task;
task body Environment_Task is
begin
Main;
loop
exit when No_More_Tasks;
Shutdown_Tasks_On_Terminate_Alternative;
end loop;
Exit_Process;
end Environment_Task;
-- Vadim Godunko
Technoserv A/S
Rostov-on-Don, Russia
Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти