0

在使用 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 保护复制行容器并“记住”它们的过程,如果之后立即释放。两者都被声明为 volatile bool,这还不够吗?顺便说一句,这是 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();

    }
4

1 回答 1

0

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

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

于 2013-05-29T06:57:32.770 回答