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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 17.09.2014, 03:15   #11
StriderX
Форумчанин
 
Регистрация: 21.04.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от northener Посмотреть сообщение
Нет никакого "Дельфийского" таймера. Есть только стандартный виндовый SetTimer с посылкой сообщения WM_TIMER окну/дельфийской форме, на которую кинули компонент TTimer.
Тада всё просто %)
Таймер крутится, делает своё чорное дело. Изредка дёргает за косичку некий ProcessMessages. Пользователь тыкает по кнопке на модальной форме - процесмесадж ловит его и лепит modalResult = mrClose. Но кто его проверяет? Проверяет его "надстроеный" цикл сообщений, а не родной, который проворачивается через ProcessMessages - то есть пока таймер не доиграет и не вернёт управление модальному циклу сообщений, никто и не будет смотреть на этот модалрезалт =-)
StriderX вне форума Ответить с цитированием
Старый 17.09.2014, 08:54   #12
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Мож попробовать ModalForm.Perform(WM_CLOSE,...); ?
Эт я так, навскидку, если чо.
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 17.09.2014, 10:50   #13
dbGo
 
Регистрация: 09.06.2012
Сообщений: 8
По умолчанию

Не работает.
Вообще никак, форма2 никак не закрывается, пока таймер на форме1 работает.
dbGo вне форума Ответить с цитированием
Старый 17.09.2014, 11:00   #14
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Не работает.
Вообще никак, форма2 никак не закрывается, пока таймер на форме1 работает.
Это ты к кому щас обращаешься?
Совет: переноси код обработчика таймера в побочный тред.
Вопрос: а таймер точно нужен? Может от него отказаться?
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 17.09.2014, 11:16   #15
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
modalResult = mrClose
А если добавить в основной форме некое булевое public свойство. В модальной форме по закрытию в это свойство True. В цикле таймера кроме ProcessMessages анализировать и это свойство на предмет True и выход из цикла и таймера при необходимости
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.09.2014, 11:30   #16
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
А если
А давайте сначала аффтар покажет нам код обработчика таймера!
Чую, там аццкий ад...
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 17.09.2014, 12:03   #17
dbGo
 
Регистрация: 09.06.2012
Сообщений: 8
По умолчанию

Про флаг, я думал и даже попробовал.
Поток я создал И.. ничего, польза от него в том что цикл в таймере докручивается до конца, раньше при вызове модальности, если таймер работал до открытия формы2, цикл в таймере стопорился.

Проблема следующая!
Если на форме1 таймер сработал И при откртии формы2, все нормально форма закрывается.
Если на форме1 таймер не сработал и открыли форму, а таймер сработал уже после открытия формы2 ТО пока цикл не добежит в таймере форма незакроется.

Тут код, упрощенный код по отношению к программе, смысл такой же, в таймере цикл делает добро.
Код:
var
  i:Integer;
begin
      for I := 0 to 10000 do
        begin
          addlog(IntToStr(i)+TimeToStr(Now()));
          Application.ProcessMessages;
        end;
end;

Последний раз редактировалось Stilet; 17.09.2014 в 20:55.
dbGo вне форума Ответить с цитированием
Старый 17.09.2014, 12:14   #18
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Поток я создал И.. ничего
Покажи код!
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Старый 17.09.2014, 13:07   #19
dbGo
 
Регистрация: 09.06.2012
Сообщений: 8
По умолчанию

Да вот код потока.
Код:
function start_sync_module:Boolean;
begin
  try
    thread_s:=TSThread.Create(true);
    thread_s.FreeOnTerminate:=false;
    thread_s.Priority:=tpNormal;
    thread_s.do_:=true;
    thread_s.Resume;
    while not thread_s.Finished do
        Application.ProcessMessages;
  finally
    FreeAndNil(thread_s);
  end;
end;

procedure TSThread.Execute;
var
  i:integer;
begin
    try
      inherited;
      Critical_Section_main:=TCriticalSection.Create;
      Critical_Section_main.Enter;
      for I := 0 to 10000 do
        begin
          addlog(IntToStr(i)+TimeToStr(Now()));
          Application.ProcessMessages;
        end;
      Critical_Section_main.Leave;
      Critical_Section_main.Free;
    except on e:Exception do
       show_msg_form(E.Message)
    end;
end;

procedure TDM_SYNC.Timer1Timer(Sender: TObject);
var
  i:Integer;
begin
   if not TIMER_CHECK then
    begin
      TIMER_CHECK:=true;
      start_sync_module;
      TIMER_CHECK:=false;
    end;
end;

Вопрос не в потоке, и без него нормально. Вопрос как закрыть форму, при запущенном цикле в таймере!




___________
Код нужно оформлять по правилам:
тегом [CODE]..[/СODE]
(кнопочка на панели форматирования с решёточкой #)
Не забывайте об этом!

Модератор.

Последний раз редактировалось Serge_Bliznykov; 17.09.2014 в 14:09.
dbGo вне форума Ответить с цитированием
Старый 17.09.2014, 13:21   #20
min@y™
Цифровой кот
Старожил
 
Аватар для min@y™
 
Регистрация: 29.08.2014
Сообщений: 7,629
По умолчанию

Цитата:
Вопрос как закрыть форму, при запущенном цикле в таймере!
Да никак, пока исполнение не выйдет за пределы обработчика таймера.
Убери везде Application.ProcessMessages(). И тред создавай один раз при запуске программы, а не по таймеру. Для синхронизации используй только Synchronize().
Расскажу я вам, дружочки, как выращивать грибочки: нужно в поле утром рано сдвинуть два куска урана...
min@y™ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 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