VSTGUI:编辑器的惯例:: open和editor :: close

时间:2013-05-28 23:28:21

标签: c++ user-interface vst

在使用VSTGUI编写新的vst-plugin时,我真的在努力学习如何使用该库,并且大部分进展都来自猜测和调试之后(因为除了百万行和ygrabit之外没有其他文档,比显而易见的更多。

到目前为止它还是很好,但我对该项目的最后贡献涉及线程,这使得设计有点问题。具体来说,我正在处理容器中的一组文本标签(进行非原子操作),当用户关闭窗口时,这些可能(显然确实)在我不知情的情况下被破坏。 甚至在更改元素之前添加检查可能仍然是个问题。所以我实际上需要控制这些对象的生命周期(这很好),除非它们在CViewContainer中显示,它会自动承担所有权。

我不知道如何编写编辑器的主干,因此我使用了一个名为VSTGUIBuilder的程序,并附加(并且基本上重写了)我需要的内容。但是,由于您可以使用的所有“视图”都需要父窗口或系统窗口,因此在到达弹出窗口时调用的AEffEditor :: Open()函数之前,无法实例化任何视图/控件。 并且只要窗口关闭,就会调用AEffEditor :: close()方法。现在,vstguibuilder放了一个

delete frame;

在AEffEditor :: close()方法中,建议您在每次打开和关闭时重建和分配所有资源。这真的可以吗?如果是的话,我是否有办法保护我的容器的内容(有关详细信息是一个向量< CTextLabel *>)从中间功能中删除?之后处理它没有问题,我只是在改变它时担心段错误。

使用互斥锁,这是最后的手段(如果调用来自主机),我不想在任何情况下挂起主机,如果我的代码出现故障而且永远不会释放。

编辑: 我最终找到了一个不那么优雅但安全工作的解决方案。这是worker函数中的代码:

        while(bLock) {
            Sleep(0);
        }
        bLock = true;

        if(msgs.empty())
            return;

        /*
            Prevent someone deletes our lines in close().
            we create a copy of the container to be 100% sure
            and increase the reference count, so we can safely
            work with our own container and we 'forget' them
            afterwards, so they will be deleted if needed.
            This ensures that close AND open can be called 
            meanwhile we are working with the lines
        */
        bDeleteLock = true;
        // also the copy constructor should work as expected here
        // since we are working with pointers, we still reference the same content.
        auto copy_lines = lines;

        for each(auto line in copy_lines) {
            line->remember();
        }
        bDeleteLock = false;

        ...

        for each(auto line in copy_lines) {
            line->forget();
        }
        cont->setDirty();

bLock是另一个保护消息队列的“互斥锁”,此功能将打印出来。 bDeleteLock保护复制行容器并“记住”它们的过程,并在之后立即释放。两者都被宣布为挥发性bool,应该不够吗?这是btw的close()方法。

    void CConsole::Close() {
        // locking lines while copying them over in a container we can work with
        while(bDeleteLock)
            Sleep(0);
        //waiting for bLock is not needed because it wont get deleted.
        if(!visible) //if we are not visible it's our responsibility to remove the view
            delete cont;

        lines.clear();

    }

1 个答案:

答案 0 :(得分:0)

啊,VSTGUI,带回了一些黑暗的记忆。 ;)但是,严重的是,您可能必须使用互斥锁来阻止主机挂起。当窗口重新打开时必须实例化所有内容似乎有些愚蠢,但你可以看到许多插件就是这样做的。

一种可能的解决方法是对缓存的视图数据使用共享内存段,然后将对该位置的引用传递回插件