Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.09.2014, 17:02   #1
dbGo
 
Регистрация: 09.06.2012
Сообщений: 8
По умолчанию Таймеры и формы. Нужна помощь.

Добрый вечер.
Есть главная форма 1, на которой висит таймер. Таймер срабатывает раз в 2 минуты.
На главной форме есть меню, одна из кнопок меню вызывает форму 2 модально.
Дело в том что когда вызвана вторая форма и срабатывает таймер на основной форме, то вторая форма не закрывается пока не отработает таймер.
В таймере крутится долгий цикл.
Вторая форма закрывается методом - modalResult:=MrCLose;
dbGo вне форума Ответить с цитированием
Старый 16.09.2014, 17:59   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Так, а если немодально вызывать?
И кстати в чем смысл всего этого? Какая задача?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.09.2014, 18:39   #3
dbGo
 
Регистрация: 09.06.2012
Сообщений: 8
По умолчанию Ответ

Надо модально, дело в том что программа довольно большая с большим количеством форм. На главной форме таймер который делает синхронизацию из БД, но нужно чтобы таймер делал синхронизацию и формы закрывались без зависаний.

В таймере цикл бежит по табицам загружает данный через IdHTTP.GET
IdHTTP в купе с антифризом.
В цикле Application.ProcessMessages, т.е. пока молотит цикл в таймере на второй форме все кликается-работает. НО когда пытаюсь закрыть форму кнопка не реагирует.
Цель такая чтобы формы закрывались при работе таймера.
dbGo вне форума Ответить с цитированием
Старый 16.09.2014, 20:43   #4
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,877
По умолчанию

Код:
пока молотит цикл в таймере на второй форме все кликается-работает. НО когда пытаюсь закрыть форму кнопка не реагирует.
Что-то странное.
northener вне форума Ответить с цитированием
Старый 16.09.2014, 23:03   #5
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от dbGo Посмотреть сообщение
Добрый вечер.
Есть главная форма 1, на которой висит таймер. Таймер срабатывает раз в 2 минуты.
На главной форме есть меню, одна из кнопок меню вызывает форму 2 модально.
Дело в том что когда вызвана вторая форма и срабатывает таймер на основной форме, то вторая форма не закрывается пока не отработает таймер.
В таймере крутится долгий цикл.
Вторая форма закрывается методом - modalResult:=MrCLose;
Ммм... с VCL вообще никак не дружу, но помню - модальные формы + таймер + ProcessMessages = неведомая магия (пачка сайд эффектов, которые неочевидны, если обладать околонулевыми познаниями VCL, например, как у меня).
А дело в том, что ShowModal "удерживает" строчку на которой находится, дальнейший код не будет выполнен пока окно не умрёт. Это можно сделать только надстроив над основным циклом приложения свой собственный (внутри ShowModal немедленно обнаружится искомый repeat until). Это как минимум гарантирует блокирование самого таймера, если окно будет открыто вовремя исполнения Application.ProcessMessages.
Соответственно и рекомендация от неуча типа меня будет одна: перепроектировать проект на многопоточный вариант, выбросить таймер в свой поток, чтобы он не мешал жить остальной логике.
StriderX вне форума Ответить с цитированием
Старый 17.09.2014, 01:37   #6
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,877
По умолчанию

Цитата:
Сообщение от StriderX Посмотреть сообщение
Это как минимум гарантирует блокирование самого таймера.
С чего бы вдруг?
northener вне форума Ответить с цитированием
Старый 17.09.2014, 02:03   #7
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
С чего бы вдруг?
Каким бы образом не работал VCL, вам желательно (при правильном проектировании) получить гарантии, что внутри таймера вы будете находиться один раз и не допустите ни параллельного вызова, ни вложенного по стеку. В самом примитивном случае на входе таймера будет стоять взведённый булев флаг, а спустить его не даст блокировка ShowModal, которая запустит свой цикл сообщений.
PS: для меня абсолютная загадка как именно работает компонента таймера - кто его вызывает, на что он там подписан и т.п. Я могу жестоко заблуждаться =-)
StriderX вне форума Ответить с цитированием
Старый 17.09.2014, 02:10   #8
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,877
По умолчанию

2 StriderX
Тут явно ТС о чём-то умалчивает или чего-то недоговаривает.
Верю что просто по незнанию и неверной трактовке своего кода.
Цитата:
для меня абсолютная загадка как именно работает компонента таймера
Не стоит так себя принижать.

Последний раз редактировалось northener; 17.09.2014 в 02:12.
northener вне форума Ответить с цитированием
Старый 17.09.2014, 02:14   #9
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
2 StriderX
Тут явно ТС о чём-то умалчивает или чего-то недоговаривает.
Верю что просто по незнанию и неверной трактовке своего кода.
Код:
для меня абсолютная загадка как именно работает компонента таймера
Не стоит так себя принижать.
Да я не принижаю, то что мне надо было на практике - это или системы реального времени и rdtsc; или же системы с фиксированной частотой процессов\таймера, где мне хватает GetTickCount. Я действительно никогда не задавался вопросом - как работает дельфийский таймер и кто обязан гарантировать изоляцию его вызовов друг от друга. В зависимости от схемы работы таймера реально возможны любые сайд эффекты, но в то же время я не могу в голове обрисовать проблему автора - у меня нет примера как так сломать специально. Только предложение сделать приложение многопоточным =)
StriderX вне форума Ответить с цитированием
Старый 17.09.2014, 02:53   #10
northener
ПШП
Участник клуба
 
Регистрация: 15.07.2013
Сообщений: 1,877
По умолчанию

Цитата:
Сообщение от StriderX Посмотреть сообщение
Да я не принижаю, то что мне надо было на практике - это или системы реального времени и rdtsc; или же системы с фиксированной частотой процессов\таймера, где мне хватает GetTickCount. Я действительно никогда не задавался вопросом - как работает дельфийский таймер и кто обязан гарантировать изоляцию его вызовов друг от друга. В зависимости от схемы работы таймера реально возможны любые сайд эффекты, но в то же время я не могу в голове обрисовать проблему автора - у меня нет примера как так сломать специально. Только предложение сделать приложение многопоточным =)
Нет никакого "Дельфийского" таймера. Есть только стандартный виндовый SetTimer с посылкой сообщения WM_TIMER окну/дельфийской форме, на которую кинули компонент TTimer.
northener вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Таймеры tools Qt и кроссплатформенное программирование С/С++ 3 30.05.2010 23:12
Таймеры Sergeu Общие вопросы C/C++ 2 25.03.2010 12:13
Очень нужна помощь c матрицами, макросами в Excel. Заранее благодарен(поверьте, очень-очень нужна помощь) Farridjan Помощь студентам 1 03.07.2009 12:24
Очень нужна помощь с написанием программы... срочно(буду благодарен за помощь) 5Paladin5 Помощь студентам 3 02.07.2009 09:12