Как закрыть все окна thread'a?
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- Старожил
- Сообщения: 238
- Зарегистрирован: 10 Ноябрь 2005, 23:07
- Откуда: Краснодар
- Благодарил (а): 6 раз
Как закрыть все окна thread'a?
Добрый день!
C6.3 ABC
Подскажите, пожалуйста, решение по закрытию открытых окон в текущей нити.
До сталкивания с проблемой, по простоте душевной, думал отлавливать событие GainFocus.
Но, при закрытии текущего окна, фокус не передается (в виде события) в предыдущее окно.
Кто сталкивался? Может есть мысли по данному поводу?
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
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
С уважением, ДП
-
- Старожил
- Сообщения: 238
- Зарегистрирован: 10 Ноябрь 2005, 23:07
- Откуда: Краснодар
- Благодарил (а): 6 раз
Re: Как закрыть все окна thread'a?
Спасибо за помощь!
Однако, при всем том, что С6.3 поддерживает NOTIFY/NOTIFICATION, я столкнулся со следующей проблемой:
посылаю из Window Events CloseWindow NOTIFY(Notify:Closed, 1) и даже отлавливаю его во фрейме, но! Похоже, что из текущей оконной процедуры NOTIFY посылается самой себе. Иными словами, отправка идет еще до закрытия текущего окна.
Стоит во фрейме во время приема NOTIFICATION прописать вывод сообщения (например: Message('2'), как все начинает работать.
В чем грабли могут быть?
Однако, при всем том, что С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() в самый конец
С уважением, ДП
-
- Старожил
- Сообщения: 238
- Зарегистрирован: 10 Ноябрь 2005, 23:07
- Откуда: Краснодар
- Благодарил (а): 6 раз
Re: Как закрыть все окна thread'a?
Так и сделал: поместил NOTIFY(111,1) в WindowManager.Kill() в самый конец.
Во фрейме, после генерации кода по событию Notify:
C Message('1') - работает, без него - нет 
P.S.
В качестве "а вдруг поможет" были произведены следующие действия:
1. Задержка отправки Post(event:CloseWindow,,GLO:StartThread) методом помещения перед ним кода, реализующего трудоемкие вычисления. Получаем задержку (в том числе и визуальную) по времени, но событие не отправляется. Так что версия с закрытием оконной процедуры самой себя, стало быть отпадает.
2. Вместо Message('1') был помещен код
Accept
break
End
что тоже не привело к успеху.
Какие мысли могут быть по данной проблеме?
Во фрейме, после генерации кода по событию Notify:
Код: Выделить всё
IF NOTIFICATION (loc:NotifyCode)
IF loc:NotifyCode = 111
Message('1')
Post(event:CloseWindow,,GLO:StartThread)
END
END

P.S.
В качестве "а вдруг поможет" были произведены следующие действия:
1. Задержка отправки Post(event:CloseWindow,,GLO:StartThread) методом помещения перед ним кода, реализующего трудоемкие вычисления. Получаем задержку (в том числе и визуальную) по времени, но событие не отправляется. Так что версия с закрытием оконной процедуры самой себя, стало быть отпадает.
2. Вместо Message('1') был помещен код
Accept
break
End
что тоже не привело к успеху.
Какие мысли могут быть по данной проблеме?
Re: Как закрыть все окна thread'a?
Вроде бы в ABC в .kill не происходит закрытия текущего окна. Может быть, поэтому события и не передаются родительскому окну.
Надо бы так:
Надо бы так:
Код: Выделить всё
ThisWindow.Kill Procedure
.....
If Status(0) = Window:OK
Close(0)
End
Post(Event:CloseWindow)
-
- Старожил
- Сообщения: 238
- Зарегистрирован: 10 Ноябрь 2005, 23:07
- Откуда: Краснодар
- Благодарил (а): 6 раз
Re: Как закрыть все окна thread'a?
Похоже, проблема решена и вопрос закрыт.
Большое спасибо Деду Пахому и Yufil !
Обе рекомендации однозначно помогли.
Что сделано:
1. Переместил NOTIFY(notify:close, 1) из Window Events CloseWindow в самый конец WindowManager.Kill()
2. Добавил суда же модифицированный код Юрия (вместо 0 (нуля) QuickWindow). Получилось:
3. Во фрейме по событию Event:Notify поместил следующий код:
где в GLO:StartThread - идентификатор нити, в которой были открыты закрываемые окна.
Большое спасибо Деду Пахому и 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
Код: Выделить всё
IF NOTIFICATION (loc:NotifyCode)
IF loc:NotifyCode = 111
Post(event:CloseWindow,,GLO:StartThread)
END
END
Re: Как закрыть все окна thread'a?
А нужен ли Notify? У меня такой код и без него работает.
Event:CloseWindow закрывает окно уровнем ниже, оно закрывает следующее и т д
Event:CloseWindow закрывает окно уровнем ниже, оно закрывает следующее и т д
-
- Старожил
- Сообщения: 238
- Зарегистрирован: 10 Ноябрь 2005, 23:07
- Откуда: Краснодар
- Благодарил (а): 6 раз
Re: Как закрыть все окна thread'a?
И в самом деле, работает. Т.е. сначала мы принудительно закрываем текущее окно, а только потом посылаем команду закрыть следующую (в данный момент - уже текущую) оконную процедуру:
Спасибо!
Код: Выделить всё
If Status(QuickWindow) = Window:OK
Close(QuickWindow)
End
Post(Event:CloseWindow)