Форум » GUI » HELP me !!! » Ответить

HELP me !!!

valery2: Есть несколько проблем: 1- я никогда не делал "серверных" прог; 1а- вытекает из первой - --- есть в трее 3 таймера, что будет, если они сойдутся во времени ? Timer_1, Timer_2, Timer_3 соответственно могут пресечся, периоды у них - (могут меняться) - 12 часов, 3 часа, 0.5 часа. Стартуют одновременно. Что произойдет, если каждый выполняет довольно длительные по времени действия?( и, судя по всему, жрет ресурсы)? 2а- они используют некоторые общие базы с разными целями (одни просто читают, но, все- сверху-вниз и неоднократно, другие еще пишут) 2-я как определить - открыта именно КОНКРЕТНАЯ база, или нет ? Очень прошу прощения за безграмотность в прог-нии. Самому попробовать(методом научного тыка) времени нет- поджимает. Может кто-нибудь уже делал такое? 3-я если остановить таймер, он продолжит выполнение(после Form_n.timer_n.enabled:=.t.) с остановленной позиции функции в проге и счетчик таймера продолжается, или все сначала? В общем - сразу СПАСИБО всем откликнувшимся!!!

Ответов - 14

valery2: Ну очень нужно ...

valery2: Пожалуйста........

fil: признаться, не очень понял задачу


valery2: Согласен, не очень внятно. 1. Беспокоит больше всего, если время вызовов функций 2-х или 3-х таймеров пересечется. Что произойдет, какие приоритеты у этих функций, не будет ли сброса из проги, или я напрасно беспокоюсь? 2. это отпадает - глупость. 3. немного попозже, после 1-го пункта.

fil: так, еще раз(глядишь еще пункт уберем). Какие функции, чего вызывают, кто на сервере, кто на станции ?

valery2: В общем, суть проблеммы в следующем. Загоняю прогу в трей. В ней определены 3 таймера:DEFINE TIMER Timer_1 OF Form_0 INTERVAL rr1 ACTION proc1() DEFINE TIMER Timer_2 OF Form_0 INTERVAL rr2 ACTION proc2() DEFINE TIMER Timer_3 OF Form_0 INTERVAL rr3 ACTION proc3() Где, соответственно ( например ) rr1:= 10 мин (10*60*1000), rr2:=5 мин , rr3:=3 мин Каждая proc отрабатывает где-то минуту ( пробовал по- отдельности). При определении всех вместе, отрабатывает только proc3() ( с наименьшим периодом). Остольные молчат - хоть убей. Что не так? Как вообще срабатывают таймеры? Ничего не понимаю!

gfilatov: valery2 пишет: Как вообще срабатывают таймеры? Почитай о таймерах здесь: http://decoding.narod.ru/api/timer/timer.html valery2 пишет: rr1:= 10 мин (10*60*1000), rr2:=5 мин , rr3:=3 мин Не рекомендуется использовать таймеры с интервалом опроса более 60000 (т.е. 1 минута)

fil: У меня впечатле, что нельзя запусть больше одного таймера одновременно. По моему проще написать обработку какого-либо события, по нему стопорить тамер для одной процы и пускать для другой. В какой-то проге я это делал по смене окна в котором находился пользователь

SADSTAR2: fil пишет: У меня впечатле, что нельзя запусть больше одного таймера одновременно. простой тестовый пример показывает что это неверно. файл timer_test.prg #include <minigui.ch> function Main() load window wMain center window wMain wMain.Timer_1.Enabled:=.f. wMain.btn_Stop1.Enabled:=.f. wMain.Timer_2.Enabled:=.f. wMain.btn_Stop2.Enabled:=.f. activate window wMain return //Main файл wMain.fmg DEFINE WINDOW TEMPLATE AT 172,382 HEIGHT 374 WIDTH 550 TITLE "Timers Test" ICON "" MAIN CURSOR "" FONT "Arial" SIZE 9 DEFINE FRAME FRAME_1 ID Nil COL 19 ROW 19 CAPTION "Timer1" WIDTH 501 HEIGHT 81 FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. BACKCOLOR Nil FONTCOLOR Nil OPAQUE .F. TRANSPARENT .F. END FRAME DEFINE BUTTON btn_Start1 COL 80 ROW 40 WIDTH 100 HEIGHT 24 CAPTION "Start" PICTURE Nil ICON Nil ACTION {||wMain.Timer_1.Enabled:=.t., wMain.btn_Stop1.Enabled:=.t., wMain.btn_Start1.Enabled:=.f.} FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. FONTCOLOR Nil ONGOTFOCUS Nil ONLOSTFOCUS Nil HELPID Nil FLAT .F. TABSTOP .T. TRANSPARENT .F. TOOLTIP Nil VISIBLE .T. DEFAULT .F. END BUTTON DEFINE BUTTON btn_Stop1 COL 80 ROW 70 WIDTH 100 HEIGHT 24 CAPTION "Stop" PICTURE Nil ICON Nil ACTION {||wMain.Timer_1.Enabled:=.f., wMain.btn_Stop1.Enabled:=.f., wMain.btn_Start1.Enabled:=.t.} FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. FONTCOLOR Nil ONGOTFOCUS Nil ONLOSTFOCUS Nil HELPID Nil FLAT .F. TABSTOP .T. TRANSPARENT .F. TOOLTIP Nil VISIBLE .T. DEFAULT .F. END BUTTON DEFINE LABEL LABEL_1 COL 190 ROW 40 VALUE "Period(mSec) = 1000" ACTION Nil WIDTH 140 HEIGHT 20 AUTOSIZE .F. FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. TOOLTIP Nil BACKCOLOR Nil FONTCOLOR Nil BORDER .f. CLIENTEDGE .f. HSCROLL .f. VSCROLL .f. TRANSPARENT .F. HELPID Nil VISIBLE .T. END LABEL DEFINE LABEL LABEL_2 COL 300 ROW 70 VALUE "Result" ACTION Nil WIDTH 100 HEIGHT 20 AUTOSIZE .F. FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. TOOLTIP Nil BACKCOLOR Nil FONTCOLOR Nil BORDER .f. CLIENTEDGE .f. HSCROLL .f. VSCROLL .f. TRANSPARENT .F. RIGHTALIGN .T. HELPID Nil VISIBLE .T. END LABEL DEFINE TEXTBOX txt_Result1 COL 410 ROW 70 WIDTH 100 HEIGHT 20 VALUE Nil READONLY .F. FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. PASSWORD .F. TOOLTIP Nil BACKCOLOR Nil FONTCOLOR Nil INPUTMASK Nil FORMAT Nil MAXLENGTH Nil UPPERCASE .F. LOWERCASE .F. ONGOTFOCUS Nil ONCHANGE Nil ONLOSTFOCUS Nil ONENTER Nil RIGHTALIGN .F. VISIBLE .T. TABSTOP .T. HELPID Nil END TEXTBOX DEFINE FRAME FRAME_2 ID Nil COL 22 ROW 114 CAPTION "Timer2" WIDTH 501 HEIGHT 81 FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. BACKCOLOR Nil FONTCOLOR Nil OPAQUE .F. TRANSPARENT .F. END FRAME DEFINE BUTTON btn_Start2 COL 82 ROW 128 WIDTH 100 HEIGHT 24 CAPTION "Start" PICTURE Nil ICON Nil ACTION {||wMain.Timer_2.Enabled:=.t., wMain.btn_Stop2.Enabled:=.t., wMain.btn_Start2.Enabled:=.f.} FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. FONTCOLOR Nil ONGOTFOCUS Nil ONLOSTFOCUS Nil HELPID Nil FLAT .F. TABSTOP .T. TRANSPARENT .F. TOOLTIP Nil VISIBLE .T. DEFAULT .F. END BUTTON DEFINE BUTTON btn_Stop2 COL 82 ROW 157 WIDTH 100 HEIGHT 24 CAPTION "Stop" PICTURE Nil ICON Nil ACTION {||wMain.Timer_2.Enabled:=.f., wMain.btn_Stop2.Enabled:=.f., wMain.btn_Start2.Enabled:=.t.} FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. FONTCOLOR Nil ONGOTFOCUS Nil ONLOSTFOCUS Nil HELPID Nil FLAT .F. TABSTOP .T. TRANSPARENT .F. TOOLTIP Nil VISIBLE .T. DEFAULT .F. END BUTTON DEFINE LABEL LABEL_3 COL 300 ROW 160 VALUE "Result" ACTION Nil WIDTH 100 HEIGHT 20 AUTOSIZE .F. FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. TOOLTIP Nil BACKCOLOR Nil FONTCOLOR Nil BORDER .f. CLIENTEDGE .f. HSCROLL .f. VSCROLL .f. TRANSPARENT .F. RIGHTALIGN .T. HELPID Nil VISIBLE .T. END LABEL DEFINE TEXTBOX txt_Result2 COL 415 ROW 158 WIDTH 100 HEIGHT 20 VALUE Nil READONLY .F. FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. PASSWORD .F. TOOLTIP Nil BACKCOLOR Nil FONTCOLOR Nil INPUTMASK Nil FORMAT Nil MAXLENGTH Nil UPPERCASE .F. LOWERCASE .F. ONGOTFOCUS Nil ONCHANGE Nil ONLOSTFOCUS Nil ONENTER Nil RIGHTALIGN .F. VISIBLE .T. TABSTOP .T. HELPID Nil END TEXTBOX DEFINE LABEL LABEL_4 COL 191 ROW 128 VALUE "Period(mSec) = 2000" ACTION Nil WIDTH 140 HEIGHT 20 AUTOSIZE .F. FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. TOOLTIP Nil BACKCOLOR Nil FONTCOLOR Nil BORDER .f. CLIENTEDGE .f. HSCROLL .f. VSCROLL .f. TRANSPARENT .F. HELPID Nil VISIBLE .T. END LABEL DEFINE BUTTON btn_Stop3 COL 80 ROW 260 WIDTH 100 HEIGHT 24 CAPTION "Stop" PICTURE Nil ICON Nil ACTION {||wMain.Timer_3.Enabled:=.f., wMain.btn_Stop3.Enabled:=.f., wMain.btn_Start3.Enabled:=.t.} FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. FONTCOLOR Nil ONGOTFOCUS Nil ONLOSTFOCUS Nil HELPID Nil FLAT .F. TABSTOP .T. TRANSPARENT .F. TOOLTIP Nil VISIBLE .T. DEFAULT .F. END BUTTON DEFINE FRAME FRAME_3 ID Nil COL 22 ROW 212 CAPTION "Timer3" WIDTH 501 HEIGHT 81 FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. BACKCOLOR Nil FONTCOLOR Nil OPAQUE .F. TRANSPARENT .F. END FRAME DEFINE BUTTON btn_Start3 COL 80 ROW 230 WIDTH 100 HEIGHT 24 CAPTION "Start" PICTURE Nil ICON Nil ACTION {||wMain.Timer_3.Enabled:=.t., wMain.btn_Stop3.Enabled:=.t., wMain.btn_Start3.Enabled:=.f.} FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. FONTCOLOR Nil ONGOTFOCUS Nil ONLOSTFOCUS Nil HELPID Nil FLAT .F. TABSTOP .T. TRANSPARENT .F. TOOLTIP Nil VISIBLE .T. DEFAULT .F. END BUTTON DEFINE LABEL LABEL_5 COL 210 ROW 228 VALUE "Period(mSec) = 3000" ACTION Nil WIDTH 140 HEIGHT 20 AUTOSIZE .F. FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. TOOLTIP Nil BACKCOLOR Nil FONTCOLOR Nil BORDER .f. CLIENTEDGE .f. HSCROLL .f. VSCROLL .f. TRANSPARENT .F. HELPID Nil VISIBLE .T. END LABEL DEFINE LABEL LABEL_6 COL 300 ROW 260 VALUE "Result" ACTION Nil WIDTH 100 HEIGHT 20 AUTOSIZE .F. FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. TOOLTIP Nil BACKCOLOR Nil FONTCOLOR Nil BORDER .f. CLIENTEDGE .f. HSCROLL .f. VSCROLL .f. TRANSPARENT .F. RIGHTALIGN .T. HELPID Nil VISIBLE .T. END LABEL DEFINE TEXTBOX txt_Result3 COL 410 ROW 260 WIDTH 100 HEIGHT 20 VALUE Nil READONLY .F. FONTNAME "Arial" FONTSIZE 10 FONTBOLD .F. FONTITALIC .F. FONTUNDERLINE .F. FONTSTRIKEOUT .F. PASSWORD .F. TOOLTIP Nil BACKCOLOR Nil FONTCOLOR Nil INPUTMASK Nil FORMAT Nil MAXLENGTH Nil UPPERCASE .F. LOWERCASE .F. ONGOTFOCUS Nil ONCHANGE Nil ONLOSTFOCUS Nil ONENTER Nil RIGHTALIGN .F. VISIBLE .T. TABSTOP .T. HELPID Nil END TEXTBOX DEFINE TIMER Timer_1 INTERVAL 1000 ACTION wMain.txt_Result1.Value:=time() DEFINE TIMER Timer_2 INTERVAL 2000 ACTION wMain.txt_Result2.Value:=time() DEFINE TIMER Timer_3 INTERVAL 3000 ACTION wMain.txt_Result3.Value:=time() END WINDOW valery2 пишет: 3-я если остановить таймер, он продолжит выполнение(после Form_n.timer_n.enabled:=.t.) с остановленной позиции функции в проге и счетчик таймера продолжается, или все сначала? Таймер только передает управление заданной процедуре. И с учетом однопоточности Харбор-программ - пока вызванная процедура не завершится - все остальное - сосет лапу.

valery2: gfilatov пишет: Не рекомендуется использовать таймеры с интервалом опроса более 60000 (т.е. 1 минута Простите за неученость, но, если, нужны интервалы в 1, 4, 8 часов, что тогда делать ?

valery2: gfilatov пишет: Не рекомендуется использовать таймеры с интервалом опроса более 60000 (т.е. 1 минута) Проверил на интервалах :proc1()- 1ч, proc2()- 1ч 30мин, proc3()- 1ч 35мин. Все 3 proc() отработали штатно !!! Сейчас запускаю более длительные периоды. Интересно ... Хотя остается вопрос пересечения по времени. Как избежать, или, как обкрутить такую ситуацию?

Sergey Spirin: valery2 пишет: Хотя остается вопрос пересечения по времени. Как избежать, или, как обкрутить такую ситуацию? В однопоточном приложении никаких пересечений процедур быть не может. Срабатывание таймера - это просто присылка срообщения WM_TIMER. Сообщение кладется в очередь, если программа в этот момент занята какой-то процедурой, то она и будет "заниматься" этой процедурой. Когда освободиться, то вынет из очереди следующее сообщение и запустит следующую процедуру. Поэтому, если у вас есть впечатление, что эти процедуры могут сработать параллельно в одном потоке, то это иллюзия.

valery2: Sergey Spirin пишет: Сообщение кладется в очередь, если программа в этот момент занята какой-то процедурой, то она и будет "заниматься" этой процедурой. Когда освободиться, то вынет из очереди следующее сообщение и запустит следующую процедуру. СПАСИБО !!!

КСС: Всем привет. Хотел бы добавить несколько слов, т.к. приходилось с подобным сталкиваться. Во-первых, если все таймеры в одном приложении, то к последнему сообщению добавить нечего, хотя можно исхитриться запустить три таймера в фоновом режиме. А вот если таймеры будут запущены из разных приложений, то все они могут работать вполне прилично даже при обработке больших объемов данных. Здесь важно: 1) выполнять сетевые блокировки и прочие вещи, для развязки сетевых коллизий, как для любого многопользовательского приложения; 2) в циклах после каждой строки (или группы строк) вставлять команду DO EVENTS или функцию ProcessMessages(). Эти команды освобождают тики времени процессору для выполнения других задач, но основная задача, конечно выполняется медленнее.



полная версия страницы