То, что вы собираетесь делать, скорее всего, будет зависеть от того, как работает DFL. Как правило, в приложении с графическим интерфейсом есть поток событий, который обрабатывает все события в вашем приложении - будь то перерисовывание событий, события нажатия кнопки, события нажатия мыши или что-то еще. Этот поток вызывает обработчик события, который зарегистрирован для обработки события (часто это виджет, по которому щелкнули или еще что-то). Проблема, с которой вы сталкиваетесь, заключается в том, что если вы попытаетесь сделать слишком много в этих обработчиках событий, вы заблокируете поток событий, чтобы другие события (включая события перерисовки) не обрабатывались своевременно. Некоторые наборы GUI даже специально ограничивают то, что вам разрешено делать в обработчике событий. Некоторые также ограничивают определенные типы операций этим конкретным потоком (например, выполнение чего-либо - особенно создание объекта - с фактическим GUI-кодом, таким как различные классы виджетов или окон, которые обязательно должен иметь инструментарий).
Как правило, способ справиться с этим состоит в том, чтобы поток событий либо запускал отдельные потоки в обработчиках событий и позволял этим другим потокам фактически обрабатывать события, либо вы устанавливаете некоторое количество состояния в обработчике событий, отдельном, уже запущенный поток получает предупреждение об этом изменении состояния (возможно, с использованием шаблона наблюдателя), и он обрабатывает вещи соответствующим образом на основе этого состояния. В любом случае то, что делают сами обработчики событий, обычно довольно ограничено.
Как работают GUI, как правило, основано на событиях. Программа обрабатывает события от пользователя и системы и, как правило, не делает ничего, если не получает сигнал об этом. Зачастую приложения с графическим интерфейсом не делают ничего , пока им не сообщат о событии (хотя существует множество случаев, когда фоновый поток выполняет какую-то работу отдельно от событий). То, что вы пытаетесь сделать, не звучит особенно на основе событий, поэтому это немного усложняет ситуацию.
Полагаю, вам нужно, чтобы ваше приложение создавало новое окно каждый раз, когда вы хотите создать новый сюжет. Это окно, вероятно, будет дочерним окном главного окна, которое будет скрыто, поскольку оно вам явно не нужно, и, вероятно, DFL требует, чтобы у вас было какое-то главное окно. Есть хороший шанс, что каждый поток, который хочет создать окно, должен будет сказать этому главное окно графического интерфейса, но это зависит от DFL. Также возможно, что DFL позволяет любому потоку создавать новые элементы графического интерфейса (например, новое окно).
Несмотря на это, это почти наверняка будет основной поток событий, который фактически обрабатывает окно. Поток, который хочет создать окно и заполнить его, вероятно, должен будет создать окно (прямо или косвенно), а затем обновить состояние окна, обновив набор общих переменных, чтобы поток событий мог соответствующим образом перекрасить окно. , Самое большее, что исходный поток, вероятно, сделает на самом деле перерисовать окно, это отправить событие перерисовки в окно после того, как он обновил состояние общих переменных, которые содержат данные, необходимые для рисования окна. Это не справится с самой картиной.
Что касается блокировки потока, то он, вероятно, должен был бы выполнить занятое ожидание, пока поток события не получит событие закрытия окна, и некоторая общая переменная не будет обновлена, или вы можете заставить его перейти в спящий режим, пока поток события не проснется это после получения события закрытия окна. В случае, если вы не хотите, чтобы он блокировался, ему просто не нужно ждать, пока ему сообщат о событии с закрытыми окнами, и он будет продолжать пыхтеть.
В любом случае, надеюсь, этой информации достаточно, чтобы направить вас в правильном направлении. Обычно события управляют всем, все, так сказать, за пределами графического интерфейса. Но в вашем случае ваше приложение использует графический интерфейс, больше похожий на стандартный вывод. Таким образом, вы могли бы лучше сначала поработать над некоторыми небольшими, довольно глупыми приложениями с графическим интерфейсом, которые являются реальными, обычными приложениями с графическим интерфейсом на основе событий (например, игра в крестики-нолики или что-то в этом роде), чтобы лучше понять, как GUI работает, прежде чем пытаться заставить его работать несколько менее стандартным способом, чем вы.