Вверх ↑
Этот топик читают: Гость
Ответов: 85
Рейтинг: 7
#1: 2011-03-25 23:57:54 ЛС | профиль | цитата
Программа скачивает с американского ФТП сервера (National Weather Service USA) файл с результами замеров усредненного геомагнитного поля Земли.
Затем анализирует последние актуальные данные и выводит их на форму и в трей. Цвет иконок: -зеленый уровень до 3, -желтый от 4 до 5, -красный выше 5 (стандарт для этого индекс) . Файл с данным америкосы выкладывают каждые 3 часа начиная с 0 по Гринвичу.
Прога подстраивается относительно времени компьютера к Гринвичу и запускается на считывание данных тоже раз в 3 часа.
Поскольку запуск программы вещь относительная, поэтому в течении отведенного часа прога делает три попытки считать данные.

Программа работает без прокси. Файл данных записывает в ту же папку от куда сама запускалась.
При запуске программа сразу же сворачивается в трей и пытается первый раз считать данные с ФТП.

Версия №1. Оптимизированная. Спасибо, Tad .
Версия №2.Добавил на форму суточную гистограмму и 30-и дневный график геомагнитной активности.
Версия №3 с цветной гистограммой.
Версия №4 гистограмму привязал к текущему времени компьютера http://hiasm.com/forum_serv.php?q=56&id=2274
карма: 0

5
файлы: 1code_23115.txt [19.7KB] [755]
Голосовали:MAV, Roma, wss60, flud, Ruthless
Ответов: 1321
Рейтинг: 37
#2: 2011-03-26 00:21:38 ЛС | профиль | цитата
Программа хорошая, но схема немного хромает
(поправил )
карма: 0

0
Ответов: 4641
Рейтинг: 334
#3: 2011-03-26 00:24:53 ЛС | профиль | цитата
[offtop]
Roma писал(а):
но схема сильно храмает

не сильно. почти сойдет![/offtop]
карма: 1
Время верстки: %cr_time% Текущее время: %time%
0
Ответов: 1304
Рейтинг: 405
#4: 2011-03-26 00:26:12 ЛС | профиль | цитата
Jek, используй лучше IconGraph, думаю наглядней будет.
карма: 3

0
Ответов: 1321
Рейтинг: 37
#5: 2011-03-26 00:26:39 ЛС | профиль | цитата
К примеру заместо выбора иконок можно было использовать BitmapArray
карма: 0

0
Ответов: 85
Рейтинг: 7
#6: 2011-03-26 00:26:45 ЛС | профиль | цитата
Roma писал(а):
Согласен. Опыта мало. Подскажите как оптимизировать.
карма: 0

0
Ответов: 1321
Рейтинг: 37
#7: 2011-03-26 00:31:44 ЛС | профиль | цитата
А для длинных связей используй LineBreak
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#8: 2011-03-26 08:58:14 ЛС | профиль | цитата
Roma писал(а):
Программа хорошая, но схема немного хромает
Ravilr писал(а):
не сильно. почти сойдет!

Ну, а если по честному, то схема демонстрирует отсутствие четкого алгоритма и полное незнание возможностей компонент.
1.Мультик первый. Открыв точку Часы,можно спокойно удалить 4-е лишних компонента

Add(Time,12522007,602,196)
{
Point(Hours)
}
2. Зачем читать реестр каждых 3 часа ? Достаточно один раз при запуске программы.
3. Вот так может смотреться мультик Управления иконками

Add(MultiElementEx,14630130,679,315)
{
}
BEGIN_SDK
Add(EditMultiEx,4121786,21,21)
{
WorkCount=#22:doCont=нет интернета 0|18:doEvent1=зеленый 1|18:doEvent11=желтый 2|19:doEvent12=Красный 3|
EventCount=#29:onEventData=Установить иконку|22:onEventData1=подсказка|16:onEvent1=уровень|
DataCount=#21:Data1=нет связи с ФТП|13:Data2=Зеленая|12:Data3=Желтая|13:Data4=Красная|
Width=444
Height=219
VOffset=28
HOffset=273
link(doCont,7350173:doEvent1,[])
link(doEvent1,3980152:doEvent1,[(70,62)(70,104)])
link(doEvent11,1023445:doEvent1,[(62,69)(62,160)])
link(doEvent12,11920410:doEvent1,[(53,76)(53,216)])
}
Add(GetIndexData,13190910,294,49)
{
Count=4
link(onIndex,8919199:doData,[])
link(Data1,4121786:Data1,[])
link(Data2,4121786:Data2,[])
link(Data3,4121786:Data3,[])
link(Data4,4121786:Data4,[])
}
Add(DoData,8919199,378,49)
{
Data=Integer(0)
link(onEventData,4121786:onEventData,[])
link(Data,13190910:Var,[(384,37)(342,37)(342,93)(300,93)])
}
Add(Hub,3980152,84,98)
{
link(onEvent1,1524061:doWork2,[(145,104)(145,62)])
link(onEvent2,10567316:doEvent1,[(192,111)(192,160)])
}
Add(Hub,1023445,84,154)
{
link(onEvent1,1524061:doWork3,[(154,160)(154,69)])
link(onEvent2,10567316:doEvent2,[])
}
Add(Hub,11920410,84,210)
{
link(onEvent1,1524061:doWork4,[(169,216)(169,76)])
link(onEvent2,10567316:doEvent3,[(181,223)(181,174)])
}
Add(StrCat,6895468,294,161)
{
Str1="Kp:"
link(onStrCat,1690547:doWork3,[(433,167)])
}
Add(Hub,7350173,84,49)
{
link(onEvent1,1524061:doWork1,[])
link(onEvent2,9023957:doData,[(137,62)(137,100)])
}
Add(DoData,9023957,378,94)
{
Data=String(Ошибка чтения)
link(onEventData,1690547:doWork2,[])
}
Add(HubEx,1690547,429,94)
{
Angle=3
link(onEvent,4121786:onEventData1,[(433,62)])
}
Add(Hub,10567316,217,154)
{
InCount=3
link(onEvent1,4121786:onEvent1,[(444,160)(444,69)])
link(onEvent2,6895468:doStrCat,[])
}
Add(ChanelToIndex,1524061,231,49)
{
Count=4
link(onIndex,13190910:doIndex,[])
}
END_SDK


------------ Дoбавленo в 07.17:
Jek, если расскажешь,алгоритм работы мультика "Определение значения Кр", то оптимизируем и его. Уж очень он некрасивый (А если некрасивый - значит алгоритм нужно реализовать по другому.)
------------ Дoбавленo в 08.57:
4. А так "Таймер запуска программы"
Add(MultiElementEx,1960512,217,245)
{
}
BEGIN_SDK
Add(EditMultiEx,7990779,21,21)
{
WorkCount=#16:doCompare=запуск|0:|
EventCount=#15:onEvent2=запуск|17:onEventData=время|
DataCount=#12:Op1=интернет|
Width=853
Height=382
VOffset=133
HOffset=679
link(doCompare,4666305:doEvent1,[(45,160)(45,328)])
}
Add(InfoTip,4595260,46,151)
{
Info=#17:1200 000 - 20 мин|
Font=[Arial,8,0,0,1]
Frame=1
HAlign=0
Width=92
Height=18
}
Add(IndexToChanel,11161837,567,154)
{
Count=24
Point(Data)
link(onEvent1,5344632:doWork2,[])
link(onEvent4,14277531:doWork2,[])
link(onEvent7,16159223:doWork2,[])
link(onEvent10,6647322:doWork2,[])
link(onEvent13,14618810:doWork2,[])
link(onEvent16,3523270:doWork2,[])
link(onEvent19,4806938:doWork2,[])
link(onEvent22,6383658:doWork2,[])
link(Data,9846774:Value,[(573,142)(507,142)(507,198)(440,198)])
}
Add(Timer,7796715,63,112)
{
Interval=1200000
Point(doInterval)
Point(onStop)
link(onTimer,9042426:doWork2,[])
}
Add(HubEx,5344632,630,154)
{
link(onEvent,2446994:doEvent1,[])
}
Add(HubEx,4806938,630,280)
{
Angle=3
link(onEvent,3523270:doWork3,[])
}
Add(HubEx,3523270,630,259)
{
Angle=3
link(onEvent,14618810:doWork3,[])
}
Add(HubEx,14618810,630,238)
{
Angle=3
link(onEvent,6647322:doWork3,[])
}
Add(HubEx,6647322,630,217)
{
Angle=3
link(onEvent,16159223:doWork3,[])
}
Add(HubEx,16159223,630,196)
{
Angle=3
link(onEvent,14277531:doWork3,[])
}
Add(HubEx,14277531,630,175)
{
Angle=3
link(onEvent,5344632:doWork3,[])
}
Add(Time,11635575,238,63)
{
Point(DateTime)
Point(Hours)
}
Add(Hub,4666305,70,322)
{
InCount=2
link(onEvent1,9042426:doWork3,[(116,328)])
link(onEvent2,6383658:doWork3,[(634,335)])
}
Add(HubEx,6383658,630,301)
{
Angle=3
link(onEvent,4806938:doWork3,[])
}
Add(Hub,2446994,651,154)
{
link(onEvent1,7990779:onEvent2,[])
link(onEvent2,12935997:doCompare,[(683,167)(683,188)])
}
Add(HubEx,9042426,112,112)
{
link(onEvent,14454241:doRead,[])
}
Add(Registry,14454241,154,112)
{
HKey=2
Key="SYSTEMCurrentControlSetControlTimeZoneInformation"
Value="Bias"
DataType=0
link(onRead,780013:doOperation,[])
}
Add(Math,780013,203,112)
{
OpType=3
Op2=60
ResultType=0
link(onResult,326791:doOperation,[])
}
Add(If_else,9396944,301,112)
{
Type=1
Op1=Integer(0)
Op2=Integer(0)
link(onTrue,8329073:doOperation,[])
link(onFalse,2738253:doData,[(344,125)(344,160)])
}
Add(Math,8329073,371,112)
{
Op1=24
ResultType=0
link(onResult,6301579:doWork1,[(417,118)])
link(Op2,2549014:Var3,[(384,96)])
}
Add(Math,326791,252,112)
{
ResultType=0
link(onResult,9396944:doCompare,[])
link(Op1,11635575:Hours,[])
}
Add(DoData,2738253,357,154)
{
Data=Integer(0)
link(onEventData,6301579:doWork2,[])
link(Data,2549014:Var2,[])
}
Add(GetDataEx,2549014,357,91)
{
Angle=3
link(Data,326791:Result,[(291,96)(291,158)(258,158)])
}
Add(HubEx,6301579,413,154)
{
link(onEvent,9846774:doValue,[])
}
Add(Memory,9846774,434,154)
{
Default=Integer(0)
link(onData,11161837:doEvent,[])
}
Add(InfoTip,8846841,131,235)
{
Info=#60:Перезапуск каждые 20 мин. Опрос по Гринвичу каждые три часа:|19:0,3,6,9,12,15,18,21|26:по местному времени (СПб):|17:3,6,9,12,15,18,21|0:|
Font=[Arial,8,0,0,1]
Frame=1
HAlign=0
Width=365
Height=60
}
Add(InfoTip,10371902,138,46)
{
Info=#27:Вычисляем время по Гринвичу|
Font=[Arial,8,0,0,1]
VAlign=2
HAlign=0
Width=351
Height=144
}
Add(If_else,12935997,700,182)
{
Op2=Integer(1)
link(onTrue,14215598:doEvent1,[])
link(onFalse,16706285:doTimer,[(744,195)(744,209)])
link(Op1,7990779:Op1,[])
}
Add(Timer,16706285,798,203)
{
Interval=60000
Enable=1
Point(doInterval)
link(onTimer,4666305:doEvent2,[(861,209)(861,385)(29,385)(29,335)])
}
Add(Hub,14215598,749,182)
{
link(onEvent1,7990779:onEventData,[(819,188)(819,167)])
link(onEvent2,16706285:doStop,[(781,195)(781,216)])
}
Add(InfoTip,8016720,684,228)
{
Info=#24:Если ошибка чтения файла|27:перезапускаем каждую минуту|
Font=[Arial,8,0,0,1]
Frame=1
HAlign=0
Width=92
Height=60
}
END_SDK
Add(InfoTip,16164125,215,207)
{
Info=#24:Таймер запуска программы|
Font=[Arial,8,0,0,1]
HAlign=0
Height=88
}



карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 1321
Рейтинг: 37
#9: 2011-03-26 09:15:16 ЛС | профиль | цитата
Jek, сделай новую, улучшенную версию программы
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#10: 2011-03-26 10:39:47 ЛС | профиль | цитата
Jek, и самое главное :
Так как файл скачивается в формате Unix, то при загрузке в StrList он грузится одной строкой и накагого там массива строк нет - там одна строка длиной около 3-х килобайт.
Зачем ты удаляешь первых 17 символов - вообще непонятно.Хотя написано "Отрезаем хвост от файла (16+1 позиция)". Режешь голову, а пишешь хвост.

Объясни порядок обработки файла DGD.txt.
------------ Дoбавленo в 10.39:
MAV(1) Roma(1) wss60(1) flud(2) - мне не жалко, но за что ? Что понравилось ?
карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 85
Рейтинг: 7
#11: 2011-03-26 10:46:40 ЛС | профиль | цитата
Roma писал(а):
Jek, если расскажешь,алгоритм работы мультика "Определение значения Кр", то оптимизируем и его. Уж очень он некрасивый (А если некрасивый - значит алгоритм нужно реализовать по другому.)

Алгоритм такой: из файла, в последней группе из 8 цифр, нужно найти последнее не отрицательное число - это и есть актуальное значение Кр.
Если такого нет, нужно искать группу на предыдущий день и брать последнее положительное число от туда.
карма: 0

0
Ответов: 1321
Рейтинг: 37
#12: 2011-03-26 10:47:20 ЛС | профиль | цитата
Tad, писал(а):
MAV(1) Roma(1) wss60(1) flud(2) - мне не жалко, но за что ? Что понравилось ?

Может и понравилось, а может и поощрение новичка за его старания
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#13: 2011-03-26 10:55:20 ЛС | профиль | цитата
Jek,
2011 03 25     2  0 0 0 1 2 1 0 1     3  0 0 0 1 3 1 1 0     3  0 0 0 1 2 1 1 1
2011 03 26 -1 -1-1-1-1-1-1-1-1 -1 -1-1-1-1-1-1-1-1 -1 -1-1-1-1-1-1-1-1
т.е. в строке за 2011.03.25 последнюю 1 ?

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Ответов: 85
Рейтинг: 7
#14: 2011-03-26 11:11:12 ЛС | профиль | цитата
Tad писал(а):
т.е. в строке за 2011.03.25 последнюю 1 ?

Правильно. Сегодня как раз удачный день чтобы проверить алгоритм.
Обычно они на сутки данные не задерживали. Максимум на 6-12 часов.
карма: 0

0
Ответов: 16884
Рейтинг: 1239
#15: 2011-03-26 11:46:58 ЛС | профиль | цитата
Jek, проверяй

Удалил


Jek писал(а):
Обычно они на сутки данные не задерживали
Там видно евреи работают - сегодня шабат - выходной

Jek, поверил тебе наслово пришлось перезалить

карма: 25
Немного терпения! Дежурный экстрасенс скоро свяжется с Вами!
0
Сообщение
...
Прикрепленные файлы
(файлы не залиты)