Вверх ↑
Этот топик читают: Гость
Ответов: 5227
Рейтинг: 587
#16: 2011-08-19 10:24:43 ЛС | профиль | цитата
а кто-то подразумевал что и кухарка справится
карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Ответов: 3889
Рейтинг: 362
#17: 2011-08-19 11:18:45 ЛС | профиль | цитата
Neo писал(а):
Тогда я четко видел когда поток еще выполняется

Neo, если актуально, могу научить как из одного потока (например, основного) "общаться жестами" с другими потоками. Не передавать данные, но узнавать о самом факте наступления какого-либо события, например, того же конца обработки данных, смотрите:


Add(MainForm,2953706,126,161)
{
@Color=11206655
Width=195
Height=31
Caption="Wait 5 seconds!"
Position=1
Point(onClose)
link(onCreate,9575151:doCreate,[(193,181)(193,161)(274,161)(274,181)])
link(onClose,9575151:doDestroy,[(193,188)(193,202)])
}
Add(Thread,12392250,413,224)
{
@Color=11206655
link(onExec,16177197:doNext,[])
}
Add(Events,9575151,280,175)
{
@Color=11184895
Name="CountDone"
Point(doDestroy)
link(onCreate,6562538:doEvent1,[])
}
Add(Hub,6562538,357,175)
{
@Color=11206655
OutCount=3
link(onEvent1,8865301:doWork,[(378,181)(378,174)])
link(onEvent2,12392250:doStart,[(392,188)(392,230)])
link(onEvent3,8207661:doStart,[(383,195)(383,300)])
}
Add(CounterEx,16177197,469,224)
{
@Color=11206655
Max=5
Point(onThroughMax)
link(onThroughMax,2068956:doWork,[])
}
Add(Message,8851497,518,294)
{
@Color=11206655
Message="Parallel thread has set the event "CountDone".
Do you wand RESET this event?"
Type=1
link(onMessage,6367498:doEvent,[])
}
Add(Thread,8207661,413,294)
{
@Color=11206655
link(onExec,11997486:doWait,[])
}
Add(WaitObject,11997486,469,294)
{
@Color=11184895
link(onWait,8851497:doMessage,[])
link(ObjHandle,2841369:getVar,[])
}
Add(IndexToChanel,6367498,588,294)
{
@Color=11206655
Count=3
link(onEvent2,4845336:doWork,[])
}
Add(LineBreakEx,11385139,203,168)
{
@Color=11184895
Caption="doSet"
Type=1
link(OnEvent,9575151:doSet,[(269,174)(269,188)])
}
Add(LineBreakEx,2841369,469,266)
{
@Color=11184895
Caption="ObjHandle"
Type=2
}
Add(LineBreakEx,1241468,280,224)
{
@Color=11184895
Caption="ObjHandle"
Type=3
link(_Data,9575151:ObjHandle,[])
}
Add(LineBreakEx,2068956,518,231)
{
@Color=11184895
Caption="doSet"
}
Add(LineBreakEx,10221058,196,182)
{
@Color=11184895
Caption="doReset"
Type=1
link(OnEvent,9575151:doReset,[(268,188)(268,195)])
}
Add(LineBreakEx,8865301,385,168)
{
@Color=11184895
Caption="doReset"
}
Add(LineBreakEx,4845336,637,301)
{
@Color=11184895
Caption="doReset"
}

------------ Дoбавленo в 11.10:
andrestudio,
[flood]
andrestudio писал(а):
кто-то подразумевал что и кухарка справится

Видимо, та же самая, что "может управлять государством" [/flood]
------------ Дoбавленo в 11.18:
1nd1g0 писал(а):
узнавать о самом факте наступления какого-либо события

Причём теоретически (если как-то передадите ObjHandle) можно устанавливатьреагировать на событие не только в другом потоке, но и в другой программе (!), запущенной от имени этого же пользователя. (Подобный механизм реализуется системным Mutex.)
карма: 1

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#18: 2011-08-19 11:40:39 ЛС | профиль | цитата
1nd1g0 писал(а):
наступления какого-либо события, например, того же конца обработки данных

То же самое, но с критическими секциями

code_24950.txt
------------ Дoбавленo в 11.40:
Хотя, в данном варианте критические секции можно выкинуть вообще. Вероятность совпадения двух сбытий, в данном случае, стремится к нулю
карма: 22

0
файлы: 1code_24950.txt [1.2KB] [235]
Ответов: 704
Рейтинг: 7
#19: 2011-08-19 12:03:49 ЛС | профиль | цитата
Спасибо за помощь и толкование!
andrestudio, кухарка она ведь разная бывает. Да и с (как сказал 1nd1g0, текстовым программированием) справиться вроде и совсем не сложно. Основные проблемы наступают при повышенных скоростях, тем более при активом управлении потоками - просто мало знаний. Вроде думаешь как и обычно - связал 2 точки и оно само как-то там будет работать, а вот и не всегда так. Сколько уже схем и схемок загубил без подозрения существования даже вот критических секций. А за каждой ерундой ведь на форум писать не будешь... Хотя уже не раз поднимал на счет вопросов производительности компонентов, схемок - чаще приходится угадывать опытным путем.
Из своего малого опыта, думаю уже просится раздел справки именно по культуре программирования в HiAsm. Я вот набегами занимаюсь, и пропустил, что использовать ЭвентФромДата вместо Мемори - зло. Хотя иконки у них схожие с безобидным ДуДата. Вот такие пирожки.
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#20: 2011-08-19 12:07:40 ЛС | профиль | цитата
Neo писал(а):
использовать ЭвентФромДата вместо Мемори - зло.
не зло, а высший пилотаж идиотизма.
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 3889
Рейтинг: 362
#21: 2011-08-19 12:13:05 ЛС | профиль | цитата
Neo писал(а):
без подозрения существования даже вот критических секций

Это потому, что HiAsm не избавляет от необходимости знать мат.часть, он даёт доступ ко многим требующим профессиональных навыков технологиям, и именно благодаря этому на нём можно делать достаточно серьёзные приложения. А SafeMode просто не был документирован до позавчерашнего дня, его почти никто не знал
карма: 1

0
Ответов: 704
Рейтинг: 7
#22: 2011-08-19 12:15:46 ЛС | профиль | цитата
А еще вопросик на счет потока: поток обязательно доходит до завершения, или бывает что он входит в элемент (какой-то) а после обработки элемент выдает уже другой поток? Как понять после какого события поток прекратится, и дальнейшая обработка запустится в новом потоке?
карма: 0

0
Ответов: 3889
Рейтинг: 362
#23: 2011-08-19 12:24:23 ЛС | профиль | цитата
Neo писал(а):
поток обязательно доходит до завершения, или бывает что он входит в элемент (какой-то) а после обработки элемент выдает уже другой поток?

Если поток начался, то он будет идти до победного конца, пока не упрётся в "тупик".

Neo писал(а):
после обработки элемент выдает уже другой поток?

Да, если в конце стоит элемент, порождающий новый поток, например, Thread или MMTimer. Изредка бывает, что некоторые события элементов (или чьего-то InlineCode) создаются системой и могут отличаться по контексту от текущего потока, в таком случае с ними желательно работать как с отдельным потоком (те же меры предосторожности). Основная масса штатных элементов не использует таких технологий, т.е. "какой поток был на входе, такой же будет на выходе".
карма: 1

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#24: 2011-08-19 12:34:47 ЛС | профиль | цитата
1nd1g0 писал(а):
Да, если в конце стоит элемент, порождающий новый поток, например, Thread или MMTimer. Бывает, что некоторые события элементов создаются системой и могут отличаться по контексту от текущего потока, в таком случае с ними желательно работать как с отдельным потоком (те же меры предосторожности)

Работа с порожденными потоками вообще жесть. Тут такие ситуации возникают -- мама не горюй. К примеру -- породили поток, что-то обрабатываем, чтобы не мешало обрабатывать дальше порождаем новый поток внутри порожденного, к примеру, для чтения каких-то данных. При составлении схемы или кода, про второго наследника забываем и грохаем основной порожденный, а второй наследник продолжал читать файл. К быбушке не ходи, что бы сказать, что такое построение вызовет крэш.
карма: 22

0
Ответов: 5227
Рейтинг: 587
#25: 2011-08-19 13:19:55 ЛС | профиль | цитата
nesco писал(а):
К бабушке не ходи, что бы сказать, что такое построение вызовет крэш.
andrestudio писал(а):
а кто-то подразумевал что и кухарка справится

карма: 4
Мой форум - http://hiasm.bbtalk.me/ схемы, компоненты...
0
Разработчик
Ответов: 26170
Рейтинг: 2127
#26: 2011-08-19 13:33:54 ЛС | профиль | цитата
Для более глубокого понимания критических секций, постараюсь привести очень простую аналогию из вполне жизненной ситуации. Предположим, у нас есть два ж/д пути, сходящихся в один. Если пустить по ним поезда, то вероятность столкновения двух поездов при схождении в один путь будет совсем не нулева, а последствия катастрофические. Чтобы такого не произошло, пути снабжают семафорами и датчиками наличия поезда, на расстонии большем длины поезда -- каждый датчик одного пути управляет семафором другого пути. При прохождении поезда через датчик, включается семафор на другом пути и идущий второй поезд останавливается, ожидая прохождения первого. Это есть не что иное, как работат SafeMode в режиме Wite. В режиме noWite, ситуаци больше похожа не на поезда, а на самолеты, когда при заходе на посадку, посадочная полоса занята, и самолет отправляют на второй круг
карма: 22

0
Ответов: 704
Рейтинг: 7
#27: 2011-08-19 13:48:59 ЛС | профиль | цитата
nesco писал(а):
на самолеты

а где он кружится в этом случае? Как быть другим самолетам, которые подлетают?
карма: 0

0
Ответов: 3889
Рейтинг: 362
#28: 2011-08-19 13:51:43 ЛС | профиль | цитата
Neo писал(а):
Как быть другим самолетам, которые подлетают?

Дружно водят хоровод на разных уровнях. То же будет с потоками (дружно зависнут на SafeMode до победного конца либо дружно завершат текущую итерацию).
карма: 1

0
Ответов: 704
Рейтинг: 7
#29: 2011-08-19 13:56:33 ЛС | профиль | цитата
И не догонит ли еще один поезд в корму того, который остановился на семафоре? Или они сами остановятся на безопасном для столкновения расстоянии
------------ Дoбавленo в 13.55:
Какие они дружные )) Только не пойму смысла - все равно на полосу не сядут и на семафор не проедут хоть там Wite, хоть NoWite
------------ Дoбавленo в 13.56:
Получается своего рода организованный стек FIFO только с подвисанием при накоплении?
карма: 0

0
Ответов: 3889
Рейтинг: 362
#30: 2011-08-19 14:06:13 ЛС | профиль | цитата
Neo писал(а):
догонит ли еще один поезд в корму того, который остановился на семафоре?

Система предупреждения есть, но иногда выходит из строя (вспомним недавние новости). У потоков вариант такого "нагона" тоже предусмотрен, пока не отработает одна итерация потока (например, подвисла по Wait), вторая не вызывается.
------------ Дoбавленo в 14.06:
Neo писал(а):
все равно на полосу не сядут и на семафор не проедут

Если движение не остановилось (заблокировавший секциюмьютекс первым поток не завис), то все по очереди отработают то, что должны были отработать (SafeMode.WaitMode=Wait), если не отказались от попыток вовсе (NoWait + Thread.FastStopdoStop).
карма: 1

0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)