Страница 1 из 1

Как закрыть все окна thread'a?

Добавлено: 15 Июнь 2014, 15:55
NewUser
Добрый день!
C6.3 ABC
Подскажите, пожалуйста, решение по закрытию открытых окон в текущей нити.
До сталкивания с проблемой, по простоте душевной, думал отлавливать событие GainFocus.
Но, при закрытии текущего окна, фокус не передается (в виде события) в предыдущее окно.
Кто сталкивался? Может есть мысли по данному поводу?

Re: Как закрыть все окна thread'a?

Добавлено: 15 Июнь 2014, 17:37
Дед Пахом
Могу предложить такой механизм:
1. фрейм закрывает верхнее окно треда: POST(Event:CloseWindow,, ThreadNo)
2. все оконные процедуры по закрытию окна шлют фрейму NOTIFY(Notify:Closed, 1)
3. фркйм обрабатывает Event:Notify, с помощью NOTIFICATION получает ThreadNo и опять шлёт POST(Event:CloseWindow,, ThreadNo), закрывая следующее окно треда

правда, я не уверен, что Event:Notify и сопутствующие функции NOTIFY/NOTIFICATION есть в C6.3

Re: Как закрыть все окна thread'a?

Добавлено: 15 Июнь 2014, 20:57
NewUser
Спасибо за помощь!
Однако, при всем том, что С6.3 поддерживает NOTIFY/NOTIFICATION, я столкнулся со следующей проблемой:
посылаю из Window Events CloseWindow NOTIFY(Notify:Closed, 1) и даже отлавливаю его во фрейме, но! Похоже, что из текущей оконной процедуры NOTIFY посылается самой себе. Иными словами, отправка идет еще до закрытия текущего окна.
Стоит во фрейме во время приема NOTIFICATION прописать вывод сообщения (например: Message('2'), как все начинает работать.
В чем грабли могут быть?

Re: Как закрыть все окна thread'a?

Добавлено: 15 Июнь 2014, 21:08
Дед Пахом
раз используете ABC, то логичнее сунуть NOTIFY в WindowManager.Kill() в самый конец

Re: Как закрыть все окна thread'a?

Добавлено: 15 Июнь 2014, 23:43
NewUser
Так и сделал: поместил NOTIFY(111,1) в WindowManager.Kill() в самый конец.
Во фрейме, после генерации кода по событию Notify:

Код: Выделить всё

IF NOTIFICATION (loc:NotifyCode)
   IF loc:NotifyCode = 111
      Message('1')
      Post(event:CloseWindow,,GLO:StartThread)
   END
END
C Message('1') - работает, без него - нет :cry:
P.S.
В качестве "а вдруг поможет" были произведены следующие действия:
1. Задержка отправки Post(event:CloseWindow,,GLO:StartThread) методом помещения перед ним кода, реализующего трудоемкие вычисления. Получаем задержку (в том числе и визуальную) по времени, но событие не отправляется. Так что версия с закрытием оконной процедуры самой себя, стало быть отпадает.
2. Вместо Message('1') был помещен код
Accept
break
End
что тоже не привело к успеху.

Какие мысли могут быть по данной проблеме?

Re: Как закрыть все окна thread'a?

Добавлено: 16 Июнь 2014, 10:51
Yufil
Вроде бы в ABC в .kill не происходит закрытия текущего окна. Может быть, поэтому события и не передаются родительскому окну.

Надо бы так:

Код: Выделить всё

ThisWindow.Kill  Procedure
..... 
  If Status(0) = Window:OK
     Close(0) 
  End 
  Post(Event:CloseWindow) 

Re: Как закрыть все окна thread'a?

Добавлено: 16 Июнь 2014, 12:00
NewUser
Похоже, проблема решена и вопрос закрыт.
Большое спасибо Деду Пахому и Yufil !
Обе рекомендации однозначно помогли.
Что сделано:
1. Переместил NOTIFY(notify:close, 1) из Window Events CloseWindow в самый конец WindowManager.Kill()
2. Добавил суда же модифицированный код Юрия (вместо 0 (нуля) QuickWindow). Получилось:

Код: Выделить всё

If Status(QuickWindow) = Window:OK
   Close(QuickWindow)
End
Post(Event:CloseWindow)
NOTIFY(111, 1) !2
3. Во фрейме по событию Event:Notify поместил следующий код:

Код: Выделить всё

IF NOTIFICATION (loc:NotifyCode)
   IF loc:NotifyCode = 111
      Post(event:CloseWindow,,GLO:StartThread)
   END
END
где в GLO:StartThread - идентификатор нити, в которой были открыты закрываемые окна.

Re: Как закрыть все окна thread'a?

Добавлено: 17 Июнь 2014, 0:57
Yufil
А нужен ли Notify? У меня такой код и без него работает.
Event:CloseWindow закрывает окно уровнем ниже, оно закрывает следующее и т д

Re: Как закрыть все окна thread'a?

Добавлено: 17 Июнь 2014, 13:20
NewUser
И в самом деле, работает. Т.е. сначала мы принудительно закрываем текущее окно, а только потом посылаем команду закрыть следующую (в данный момент - уже текущую) оконную процедуру:

Код: Выделить всё

If Status(QuickWindow) = Window:OK
   Close(QuickWindow)
End
Post(Event:CloseWindow)
Спасибо!