在托管 c++/.net 4.0 中创建对象的 ConcurrentQueue

Posted

技术标签:

【中文标题】在托管 c++/.net 4.0 中创建对象的 ConcurrentQueue【英文标题】:Creating a ConcurrentQueue of objects in managed c++/.net 4.0 【发布时间】:2012-11-25 02:27:41 【问题描述】:

我一直在尝试更新我继承的一些托管 c++ 代码。我不知道任何 c++,但我在 1.1 天参加了一个 c# 课程,所以我可以在 .Net 中找到自己的方式。到目前为止,我使用 ConcurrentQueue 将工作从我的主线程发送到工作线程已经取得了很好的效果:

fullQueue = gcnew ConcurrentQueue<int>();

..

fullQueue->Enqueue(someNumber);

现在我想尝试插入实际对象,以便向工作人员发送更复杂的指令。但是,这不起作用:

public ref class workUnit

    int ptrOffset;
    System::String^ outputPath;
    public:
        workUnit(int offset, System::String^ path)
        
            ptrOffset=offset;
            outputPath=path;
        
;    

..

ConcurrentQueue test = gcnew ConcurrentQueue<workUnit ^>();

我明白了:

'System::Collections::Concurrent::ConcurrentQueue' : use of class generic requires generic argument list

'System::Collections::Concurrent::ConcurrentQueue::ConcurrentQueue' : the function template cannot convert parameter 1 from type 'System::Collections::Concurrent::ConcurrentQueue<T> ^'

显然,我遗漏了有关如何将对象插入队列的基本知识。在我的脑海中,我想我正在创建一个队列来保存对稍后可以实例化的类对象的引用,因此 CLR 应该只需要知道将进入什么引用类型,但显然这是不正确的。我错过了什么?

【问题讨论】:

【参考方案1】:

好像你错过了什么:)

using namespace System::Collections::Concurrent;

ref class WorkUnit

;

int main()

    ConcurrentQueue<WorkUnit^>^ test = gcnew ConcurrentQueue<WorkUnit^>();

您必须在初始化表达式的两侧引用泛型类型

【讨论】:

以上是关于在托管 c++/.net 4.0 中创建对象的 ConcurrentQueue的主要内容,如果未能解决你的问题,请参考以下文章

从 C++ 访问在 python 中创建的 C++ 类

如何在 C#.Net 中创建原型方法(如 JavaScript)?

如何在Visual C ++中创建非托管Windows GUI?

C# .Net 4.0 应用程序中托管的 C++ ActiveX 控件中的 Xml.Serializer 非法强制转换异常

.NET Framework (v 4.0) COM 注册免费从 Win32 C++ 应用程序调用

.net 4.0 创建具有全局上下文的 MemoryMappedFile 会引发异常