Загадка про TabBar (с картинками)
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4615
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
Загадка про TabBar (с картинками)
Не знаю, поможет ли. В mdi окне отработка события openWindow происходит после того, как сделаны все запуски из фрейма. Без разницы, через run или even:accepted. Поскольку управление окнам строится на глобальных структурах (у меня во всяком случае), то это приводит к багу, напоминающему Ваш. У себя я получил корректный запуск нескольких mdi окон через пользовательское событие. То есть во фрейме на событии OpenWindow шлем post(5002). На этом событии по счетчику стартуем нужное mdi окно. В mdi окне на событии openWindow шлем во фрейм post(5002,,1). Во фрейме на событии 5002 увеличиваем счетчик и стартуем очередное mdi окно. То есть во фрейме можно организовать локальную очередь запускаемых автоматически при входе в программу тредов. А во все дочернии mdi окна шаблоном прописать отправку пользовательского события на фрейм, сигнализируя, что тред инициализировался. Как-то так, у меня работает...
C6/C11, ШВС, tps/btrieve.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4615
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
Загадка про TabBar (с картинками)
То, что я написал в предыдущем посте, позволяет упорядочить запускаемые mdi окна в порядке их запуска. При обычных start второе запущенное окно может инициализироваться до первого и т.п. Причем раз на раз не приходится. Скорее всего, проблема в TabBar тоже с этим связана.
Нашел по ходу еще странный баг, который присутствует и в c6, и в c10. Есть глобальная нетредная строковая переменная. Если присвоить ей значение до open(window), то после открытия окна она может очищаться. Причем именно в режиме последовательного запуска нескольких mdi окон из фрейма при старте программы. При запуске одного из меню (как обычно) все нормально. Если перенести присвоение этой переменной после open(window), то все нормально.
В общем, после этих поправок все заработало, как надо. И в c6, и в c10...
Нашел по ходу еще странный баг, который присутствует и в c6, и в c10. Есть глобальная нетредная строковая переменная. Если присвоить ей значение до open(window), то после открытия окна она может очищаться. Причем именно в режиме последовательного запуска нескольких mdi окон из фрейма при старте программы. При запуске одного из меню (как обычно) все нормально. Если перенести присвоение этой переменной после open(window), то все нормально.
В общем, после этих поправок все заработало, как надо. И в c6, и в c10...
C6/C11, ШВС, tps/btrieve.
-
- ✯ Ветеран ✯
- Сообщения: 4983
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 20 раз
Загадка про TabBar (с картинками)
Игорь, давай тестовый пример. Может оказаться дело в билде Клариона, в оси и т.д.
We are hard at work… for you.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Загадка про TabBar (с картинками)
1. Сделал новое приложение для теста - всё работает штатно (проблемы нет).
2. Перенёс в него окна из рабочей программы - всё работает штатно (проблемы нет).
3. Сделал все настройки, Extensions как в рабочих программах - - всё работает штатно (проблемы нет).
Ничего не понимаю.
Остаётся только применить принцип "Бритвы Оккама" отсекая всё в рабочих приложениях.
Что бы найти причину - это займёт некоторое время ...
2. Перенёс в него окна из рабочей программы - всё работает штатно (проблемы нет).
3. Сделал все настройки, Extensions как в рабочих программах - - всё работает штатно (проблемы нет).
Ничего не понимаю.
Остаётся только применить принцип "Бритвы Оккама" отсекая всё в рабочих приложениях.
Что бы найти причину - это займёт некоторое время ...
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Загадка про TabBar (с картинками)
Я её поймал ! Если кому интересно, выполните:
1. Распаковать пример, загрузить в C10 (с конвертацией) и собрать.
(постарался сделать минимальный пример штатными средствами, что бы не замылить проблему)
2. Запустить пример, открыть меню и в нём открыть ещё пару окон.
3. Наблюдаем глюк описанный в первом сообщении этой темы.
4. Закрываем все MDI окна, заново открываем несколько MDI окон - всё как и должно быть.
Причина проблемы в ошибочно установленной опции:
Дело-то пахнет грубой ошибкой Runtime C10 ...
1. Распаковать пример, загрузить в C10 (с конвертацией) и собрать.
(постарался сделать минимальный пример штатными средствами, что бы не замылить проблему)
2. Запустить пример, открыть меню и в нём открыть ещё пару окон.
3. Наблюдаем глюк описанный в первом сообщении этой темы.
4. Закрываем все MDI окна, заново открываем несколько MDI окон - всё как и должно быть.
Причина проблемы в ошибочно установленной опции:
Дело-то пахнет грубой ошибкой Runtime C10 ...
- Вложения
-
- The_Test.zip
- (7.65 КБ) 85 скачиваний
За теми кто отстал - не возвращаться. (С) Кодекс
-
- ✯ Ветеран ✯
- Сообщения: 4983
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 7 раз
- Поблагодарили: 20 раз
Загадка про TabBar (с картинками)
Да. Устойчиво. Насчёт ошибки вопрос ещё. Странный вызов source процедуры. Получается, она висит и мешает нормальным тредам?
We are hard at work… for you.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Загадка про TabBar (с картинками)
Абсолютно нормальный вызов процедуры ... Для запуска безоконного потока не требуется AppFrame.
Этот поток не висит, он пустой и моментально завершается ....
Никто не запрещает, например, создавать безоконное приложение, которое будет запускать потоки с какой-то
обработкой, сама отслеживать их выполнение и т.д. Можно даже запустить такое приложение как службу Windows ...
А вот то, что запущенный совсем в другом окне поток нарушает работу еще не запущенного AppFrame - это проблема !
И что-то мне подсказывает, что это ключ к решению старой проблемы, о которой я говорил вот здесь:
https://forum.clarionlife.net/viewtopic ... 9&start=60
Этот поток не висит, он пустой и моментально завершается ....
Никто не запрещает, например, создавать безоконное приложение, которое будет запускать потоки с какой-то
обработкой, сама отслеживать их выполнение и т.д. Можно даже запустить такое приложение как службу Windows ...
А вот то, что запущенный совсем в другом окне поток нарушает работу еще не запущенного AppFrame - это проблема !
И что-то мне подсказывает, что это ключ к решению старой проблемы, о которой я говорил вот здесь:
https://forum.clarionlife.net/viewtopic ... 9&start=60
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4615
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
Загадка про TabBar (с картинками)
Ммм... Игорь, если Вы запускаете в отдельном потоке безоконную процедуру, то должны самостоятельно в ней инициализировать поток и завершить его при выходе. В языке есть специальные операторы для этого. Когда в потоке запускается оконная процедура, кларионовский рантайм все делает автоматически с открытием и закрытием окна. Я безоконные потоки сейчас не использую, но когда-то разбирался с этим вопросом. Остальное поищите в документации...
C6/C11, ШВС, tps/btrieve.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4615
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
Загадка про TabBar (с картинками)
Не так написал, дело не в открытии/закрытии окна, а в наличии accept. Давно уже было, склероз... Посмотрите на SUSPEND и RESUME.
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Загадка про TabBar (с картинками)
К сожалению, нет ... Убрал из примера полностью notMDI окно (вместе с ACCEPT) - проблема осталась ...
Что касается "SUSPEND и RESUME" - это потрясающе интереснесная тема, но к сожалению совсем из другой сказки.
Или удивите меня ! Уберите пожалуйста проблему в моём примере с помощью SUSPEND и RESUME ...
(пример прилагаю)
- Вложения
-
- The_Test.zip
- (7.34 КБ) 95 скачиваний
За теми кто отстал - не возвращаться. (С) Кодекс
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4615
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
Загадка про TabBar (с картинками)
Увы, я не использую abc. Они у меня даже не установлены...
Если в source процедуре просто воткнуть скобки из SUSPEND и RESUME, не помогает?
Если в source процедуре просто воткнуть скобки из SUSPEND и RESUME, не помогает?
C6/C11, ШВС, tps/btrieve.
- finsoftrz
- ✯ Ветеран ✯
- Сообщения: 4615
- Зарегистрирован: 06 Ноябрь 2014, 12:48
- Благодарил (а): 6 раз
- Поблагодарили: 37 раз
Загадка про TabBar (с картинками)
Или в source процедуре есть свой accept? Я помню, что если просто стартануть source процедуру в которой нет accept, в отдельном треде (типа start(myproc,25000)), а потом ее завершить без использования SUSPEND и RESUME, то некорректно получалось.
C6/C11, ШВС, tps/btrieve.
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Загадка про TabBar (с картинками)
Понял ! Это уже деловой разговор ... Давненько я не брал в руки шашек ...
Сделал пример на Legacy, там всего-то 3 пустых процедуры. Проблемы - те же (RTL ведь один и тот же).
Будет возможность - посмотрите пожалуйста. Буду благодарен за любой совет по существу вопроса.
- Вложения
-
- Legacy.zip
- (7.99 КБ) 79 скачиваний
За теми кто отстал - не возвращаться. (С) Кодекс
- Игорь Столяров
- Ветеран движения
- Сообщения: 7373
- Зарегистрирован: 07 Июль 2005, 10:19
- Откуда: г. Ростов-на-ДоМу
- Благодарил (а): 13 раз
- Поблагодарили: 48 раз
Загадка про TabBar (с картинками)
Кстати, интересный приход ...
Ведь если можно предопределить порядок открытия нескольких MDI окон при открытии AppFrame,
то значит можно связать порядковый номер открытого MDI окна с номером его потока.
И мы точно знаем когда открыто последнее MDI окно ....
И как следствие - после завершения открытия всех MDI окон, можно сделать активным окно с нужным порядковым номером.
Т.е., например, в настройке программы можно задать произвольный список открываемых при запуске окон (в т.ч. и одинаковых)
в нужной последовательности и порядковый номер активного окна после запуска. А пойду-ка я попробую это сделать ...
За теми кто отстал - не возвращаться. (С) Кодекс