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

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
NewUser
Старожил
Сообщения: 238
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 6 раз

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

Сообщение NewUser »

Добрый день!
C6.3 ABC
Подскажите, пожалуйста, решение по закрытию открытых окон в текущей нити.
До сталкивания с проблемой, по простоте душевной, думал отлавливать событие GainFocus.
Но, при закрытии текущего окна, фокус не передается (в виде события) в предыдущее окно.
Кто сталкивался? Может есть мысли по данному поводу?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

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

Сообщение Дед Пахом »

Могу предложить такой механизм:
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
С уважением, ДП
NewUser
Старожил
Сообщения: 238
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 6 раз

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

Сообщение NewUser »

Спасибо за помощь!
Однако, при всем том, что С6.3 поддерживает NOTIFY/NOTIFICATION, я столкнулся со следующей проблемой:
посылаю из Window Events CloseWindow NOTIFY(Notify:Closed, 1) и даже отлавливаю его во фрейме, но! Похоже, что из текущей оконной процедуры NOTIFY посылается самой себе. Иными словами, отправка идет еще до закрытия текущего окна.
Стоит во фрейме во время приема NOTIFICATION прописать вывод сообщения (например: Message('2'), как все начинает работать.
В чем грабли могут быть?
Аватара пользователя
Дед Пахом
Старичок
Сообщения: 3289
Зарегистрирован: 07 Июль 2005, 16:51
Откуда: Москва, Россия
Благодарил (а): 15 раз
Поблагодарили: 49 раз
Контактная информация:

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

Сообщение Дед Пахом »

раз используете ABC, то логичнее сунуть NOTIFY в WindowManager.Kill() в самый конец
С уважением, ДП
NewUser
Старожил
Сообщения: 238
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 6 раз

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

Сообщение 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
что тоже не привело к успеху.

Какие мысли могут быть по данной проблеме?
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение Yufil »

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

Надо бы так:

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

ThisWindow.Kill  Procedure
..... 
  If Status(0) = Window:OK
     Close(0) 
  End 
  Post(Event:CloseWindow) 
NewUser
Старожил
Сообщения: 238
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 6 раз

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

Сообщение 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 - идентификатор нити, в которой были открыты закрываемые окна.
Yufil
Ветеран движения
Сообщения: 1277
Зарегистрирован: 16 Май 2006, 14:34
Контактная информация:

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

Сообщение Yufil »

А нужен ли Notify? У меня такой код и без него работает.
Event:CloseWindow закрывает окно уровнем ниже, оно закрывает следующее и т д
NewUser
Старожил
Сообщения: 238
Зарегистрирован: 10 Ноябрь 2005, 23:07
Откуда: Краснодар
Благодарил (а): 6 раз

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

Сообщение NewUser »

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

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

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