在使用 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();
}