Вверх ↑
Этот топик читают: Гость
Ответов: 16884
Рейтинг: 1239
#61: 2011-08-24 22:02:29 ЛС | профиль | цитата
Neo писал(а):
Но если использовать БД в памяти, то какие плюсы? Тот же стек, только еще прибавится работы со строками, верно?
А ты пиши в <таблицу в памяти> только то, что пишешь сейчас в СТЕК и какая работа со строками ? Возможна и групповая обработка. НО Neo, извини, НО
Tad писал(а):
Для более конкретной подсказки нужно видеть алгоритм проги.

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 704
Рейтинг: 7
#62: 2011-08-25 21:07:40 ЛС | профиль | цитата
Ребята, в общем что-то я пришел в отчаянье: проработало 5 суток и зависло. При этом таймер внутреннего отсчета показывает на момент зависания всегда цифру по маске "*998". Например 123998 или 244998. Внутренний отсчет этот построен таким образом: code_25005.txt

Выбрал кусочек схемы. Там принцип в том, чтоб не возиться с реальным временем, а тупо считать себе свое исчисление. Правда каждый тик таймера проверяется в 2 разных БД SQLite. Но тормозов это вроде не дает, да и времени в 100 для этого вагон и тележка.
------------ Дoбавленo в 21.07:
Сам себя проверяя, думаю может таймер потоком заменить с синхронизированным выходом? Но разве может он так портить жизнь?
------------ Дoбавленo в 21.07:
Если так, то ММтаймер получается вообще лучше не ставить...
карма: 0

0
файлы: 1code_25005.txt [958B] [218]
Ответов: 3889
Рейтинг: 362
#63: 2011-08-25 21:20:32 ЛС | профиль | цитата
Neo писал(а):
ММтаймер получается вообще лучше не ставить...

У меня с ним схемы месяцами работают без проблем.

Neo писал(а):
проработало 5 суток и зависло

Ведите параллельные логи из разных частей схемы, отслеживайте, какое место не отрабатывает.
карма: 1

0
Ответов: 704
Рейтинг: 7
#64: 2011-08-25 21:32:59 ЛС | профиль | цитата
Дело в том, что при зависании нет возможности просмотреть дебаг же. А зависание всегда четко на счете *998.
------------ Дoбавленo в 21.24:
Это 998 откуда берется? Почему именно это значение?
------------ Дoбавленo в 21.32:
И еще: программа запущенная под HiAsm работает в ограничениях? Потому, что если оставить так программу после компиляции - она висла за сутки, а если запустить уже готовый exe - работает и до месяца.
карма: 0

0
Ответов: 3889
Рейтинг: 362
#65: 2011-08-25 21:33:00 ЛС | профиль | цитата
На всякий случай поставьте SafeMode (с NoWait и уникальным именем)сразу на выходе onTimer, просто чтобы исключить "нагон" одним потоком - другого. Либо используйте Thread с ненулевым Delay.
карма: 1

1
Голосовали:Neo
Ответов: 704
Рейтинг: 7
#66: 2011-08-26 19:59:17 ЛС | профиль | цитата
Подскажите, какой из этих компонентов дает на выходе, к которому подведено сообщение, новый поток?

Компонент порта прилагаю http://hiasm.com//getfile/5987

code_25011.txt
карма: 0

0
файлы: 1code_25011.txt [673B] [216]
Разработчик
Ответов: 26170
Рейтинг: 2127
#67: 2011-08-26 20:07:51 ЛС | профиль | цитата
Neo писал(а):
Подскажите, какой из этих компонентов дает на выходе, к которому подведено сообщение, новый поток?

ComAsync. У него и название говорит само о себе -- асинхронный COM-порт
карма: 22

0
Ответов: 704
Рейтинг: 7
#68: 2011-08-26 20:30:21 ЛС | профиль | цитата
nesco, но если я считываю по eventchar, то разве это асинхронное действие? Я подозреваю из-за этого жизненно важного компонента, у меня все проблемы. Получается нужно стек на выходе из него поставить?
------------ Дoбавленo в 20.29:
И снова возвращаюсь к прошлой проблеме. 1nd1g0, разъясни еще с критическими секциями: почему этот пример считает разные значения в дебаге и отрабатывает неправильно при несколько разовом нажатии +100 хоть в схеме с сейфмод, хоть без него?

Add(MultiElement,13162162,168,420)
{
@Hint=#29:Новый поток с теми же данными|
@Color=0
link(onEvent1,12643708:doEvent,[])
}
BEGIN_SDK
Add(EditMulti,1509263,21,21)
{
EventCount=1
WorkCount=1
Width=265
Height=186
link(doWork1,2799306:doSafeMode,[(91,27)(91,41)])
}
Add(StackEx,8158179,217,49)
{
StackType=0
Point(Count)
Point(onEmpty)
link(onPop,1912671:doValue,[(261,62)(261,100)(58,100)(58,139)])
}
Add(SafeMode,2799306,161,35)
{
Name="izmenen"
link(onSafeMode,8158179:doPush,[(205,41)(205,55)])
}
Add(SafeMode,6926774,161,77)
{
Name="izmenen"
WaitMode=1
link(onSafeMode,8158179:doPop,[(202,83)(202,62)])
}
Add(Timer,10398723,63,77)
{
Interval=25
link(onTimer,5564047:doCompare,[])
}
Add(If_else,5564047,105,77)
{
Op2=Integer(0)
link(onTrue,6926774:doSafeMode,[])
link(Op1,14659451:Busy,[(111,65)(115,65)(115,177)(118,177)])
}
Add(Thread,14659451,112,133)
{
Delay=0
FastStop=0
link(onExec,368420:doData,[])
}
Add(Memory,1912671,70,133)
{
link(onData,14659451:doStart,[])
}
Add(DoData,368420,161,133)
{
link(onEventData,1509263:onEvent1,[(239,139)(239,27)])
link(Data,1912671:Value,[(167,121)(121,121)(121,177)(76,177)])
}
END_SDK
Add(Timer,7369915,49,133)
{
Interval=1
AutoStop=100
OverCall=1
link(onTimer,13571822:doWork1,[(123,139)])
}
Add(MainForm,1433557,315,581)
{
Height=185
Caption="Пример использования WaitObject"
}
Add(Debug,16768630,140,182)
{
WEName="1"
link(onEvent,3157026:doWork1,[])
}
Add(Debug,12198587,210,182)
{
WEName="1"
link(onEvent,9010111:doFor,[])
}
Add(For,9010111,252,182)
{
End=100
IncludeEnd=1
link(onEvent,13816107:doText,[])
}
Add(Edit,13816107,301,182)
{
Left=270
Top=18
Width=95
Text=""
}
Add(Button,3594207,28,42)
{
Left=10
Top=20
Caption="+100"
link(onClick,7369915:doTimer,[(72,48)(72,94)(37,94)(37,139)])
}
Add(Button,16146923,28,175)
{
Left=10
Top=40
Caption="+1"
Data=Integer(2)
link(onClick,13571822:doWork2,[(93,181)(93,146)])
}
Add(HubEx,13571822,119,140)
{
Angle=1
link(onEvent,16768630:doEvent,[(123,188)])
}
Add(MultiElement,3157026,168,182)
{
@Hint=#29:Новый поток с теми же данными|
@Color=0
link(onEvent1,12198587:doEvent,[])
}
BEGIN_SDK
Add(EditMulti,14722224,21,21)
{
EventCount=1
WorkCount=1
Width=265
Height=186
link(doWork1,8214537:doPush,[(119,27)(119,55)])
}
Add(StackEx,8214537,217,49)
{
StackType=0
Point(Count)
Point(onEmpty)
link(onPop,14380976:doValue,[(261,62)(261,100)(58,100)(58,139)])
}
Add(Timer,8337377,63,77)
{
Interval=25
link(onTimer,15039216:doCompare,[])
}
Add(If_else,15039216,105,77)
{
Op2=Integer(0)
link(onTrue,8214537:doPop,[(177,83)(177,62)])
link(Op1,3444956:Busy,[(111,65)(115,65)(115,177)(118,177)])
}
Add(Thread,3444956,112,133)
{
Delay=0
FastStop=0
link(onExec,10866645:doData,[])
}
Add(Memory,14380976,70,133)
{
link(onData,3444956:doStart,[])
}
Add(DoData,10866645,161,133)
{
link(onEventData,14722224:onEvent1,[(239,139)(239,27)])
link(Data,14380976:Value,[(167,121)(121,121)(121,177)(76,177)])
}
END_SDK
Add(Timer,15652490,56,371)
{
Interval=1
AutoStop=100
OverCall=1
link(onTimer,15355477:doWork1,[(130,377)])
}
Add(Debug,3116863,147,420)
{
WEName="1"
link(onEvent,13162162:doWork1,[])
}
Add(Debug,12643708,217,420)
{
WEName="1"
link(onEvent,2187826:doFor,[])
}
Add(For,2187826,259,420)
{
End=100
IncludeEnd=1
link(onEvent,773462:doText,[])
}
Add(Edit,773462,308,420)
{
Left=270
Top=88
Width=95
Text=""
}
Add(Button,12642026,35,280)
{
Left=10
Top=90
Caption="+100"
link(onClick,15652490:doTimer,[(79,286)(79,332)(44,332)(44,377)])
}
Add(Button,589894,35,413)
{
Left=10
Top=110
Caption="+1"
Data=Integer(2)
link(onClick,15355477:doWork2,[(100,419)(100,384)])
}
Add(HubEx,15355477,126,378)
{
Angle=1
link(onEvent,3116863:doEvent,[(130,426)])
}


------------ Дoбавленo в 20.30:
Компонент For поставлен как нагрузка схеме.
карма: 0

0
Разработчик
Ответов: 26170
Рейтинг: 2127
#69: 2011-08-26 20:35:11 ЛС | профиль | цитата
Neo писал(а):
Получается нужно стек на выходе из него поставить?

А что мешает попробовать
карма: 22

0
Ответов: 3889
Рейтинг: 362
#70: 2011-08-27 00:27:43 ЛС | профиль | цитата
Neo, весь топик не устаю повторять, что SafeMode логично ставить после onExec, и с элементами интерфейса на форме из потоков работать нельзя. И многопоточная отладка, боюсь, Вас только запутает - параллельные экземпляры Debug тоже должны конфликтовать по примеру остальных участков схемы.
карма: 1

0
Ответов: 704
Рейтинг: 7
#71: 2011-08-27 00:59:07 ЛС | профиль | цитата
nesco, уезжал на вечер и боялся оставить без контроля - вдруг зависнит. Попробую обязательно, только додумался.
1nd1g0, осмелюсь попросить Вас набросать: как сделать в этой схемке правильно, и чтоб не работать с интерфейсом из потока? И как тогда расставить дебаги, почему они параллельные? Универсально, так сказать. Раньше не раз нуждался в подобном (как думаю и другие), а сейчас просто "припекло".
Весь опыт только из HiAsm, поэтому все познаю только шерстением форума. С другой стороны, сейчас не все программисты знают первоисточники 1/0 программирования, и программируют для себя за счет оболочек .
карма: 0

0
Ответов: 3889
Рейтинг: 362
#72: 2011-08-27 01:08:11 ЛС | профиль | цитата
Neo писал(а):
набросать: как сделать в этой схемке правильно

"Правильность", при условии неизвестности алгоритма программы в целом, - категория относительная, но я уже давал простейшие схемы с одним потоком и ненулевой Delay. Дебаги перестанут сбоить сразу же, как они окажуться в ветке, порождённой точкой onSafeMode.
карма: 1

0
Ответов: 704
Рейтинг: 7
#73: 2011-08-27 15:25:49 ЛС | профиль | цитата
Я что-то не понимаю, или каждую схемочку нужно строить каждый раз по-другому, из-за алгоритма программы?
Я не могу добиться преобразования асинхронного потока в синхронизированную очередь и весь топик посвящен этому. Потом буду применять эту схемку в разных позах во всех остальных программах, где нужно будет разгружать такие вот накопления событий и дальше их обрабатывать. Сори, но Ваши схемы не дают результат безошибочной обработки.
Как же данные, которые идут на дебаг (события от таймера)? Это для примера таймер поставлен, а с такой же завидной регулярностью данные могут вылететь из com-порта, и, получается, не дойдут до обработки?
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#74: 2011-08-27 20:45:51 ЛС | профиль | цитата
Neo писал(а):
"Я не могу добиться преобразования асинхронного потока в синхронизированную очередь и весь топик посвящен этому."
Может быть "асинхронный stream" ?
"stream" и "thread" совершенно разные вещи, хотя и переводятся одним словом "поток" ("thread" имеет ещё одно значение - "нить")
Может быть запустить "асинхронный stream" в отдельном "thread" и разобраться с синхронизацией ?
Neo писал(а):
Сори, но Ваши схемы не дают результат безошибочной обработки.
Может правильные схемы от 1nd1g0 ты просто неправильно используешь?
Насчет советов:
Tad писал(а):
Для более конкретной подсказки нужно видеть алгоритм проги.
1nd1g0 писал(а):
"Правильность", при условии неизвестности алгоритма программы в целом, - категория относительная

------------ Дoбавленo в 20.45:
Мой преподаватель когда-то говорил: Если что-то работает не так как надо - ошибка в алгоритме.
------------ Дoбавленo в 20.45:
( и не только в программировании)
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 704
Рейтинг: 7
#75: 2011-08-28 20:59:29 ЛС | профиль | цитата
Tad, я и говорю, что ошибка в алгоритме. Совсем не хочу уличить аппаратную часть ПК в ошибке )))
Но алгоритм я привел - описал почему, что да как. Советы есть даже с конкретными примерами, но примеры не работают под нагрузкой, а советы остаются на уровне "должно работать".
При чем все "Опытные" утверждают в топике, что у всех потоки работают без сбоев, а схему мою не могут толком не "разбить в пух", не "утвердить на оскар". Я вижу что не пашет, но моих знаний программирования, выращенных на HiAsm, явно мало чтоб различить асинхронный stream от thread - для меня это одно и то-же - квадратик с иконочкой на поле HiAsm, который позволяет программе не тормозя работать.
------------ Дoбавленo в 20.53:
И поскольку схемка претендует на уникальность, раз нет таких универсальных аналогов для поочередного исполнения очереди, то думал прийти к решению вместе за нехваткой знаний о жизни за пределами HiAsm.
------------ Дoбавленo в 20.54:
Но с каждым ответом знающих, вижу что такая проблема волнует только меня
------------ Дoбавленo в 20.56:
Ответ с базами, считаю нерентабельным поскольку из этой базы нужно еще читать, а это тот же геморрой, только сбоку. Поток ведь все равно нужно контролировать и пускать только в свободные от вычислений закоулки схемы.
------------ Дoбавленo в 20.59:
И если есть утверждения, что база сама способна управлять выдаваемыми потоками - это заблуждение. База их выплевывает как "Максим" пули. И ей совсем все равно успел предыдущий пройти просчеты или нет.
карма: 0

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