小编mic*_*ett的帖子

Java - 用于非阻塞套接字的多个线程中的多个选择器

我正在编写一个Java应用程序,它将实例化一个类的对象,以表示已在我的应用程序的另一端连接并注册到外部系统的客户端.

每个客户端对象都有两个嵌套类,表示前端和后端.前端类将不断从实际客户端接收数据,并将指示和数据发送到后端类,后端类将从前端获取数据并使用适当的格式和协议将其发送到外部系统该系统需要.

在设计中,我们希望将客户端对象的每个实例化都作为一个线程.然后,在每个线程中自然会有两个插槽[编辑],每个插槽都有自己的NIO通道[/ EDIT],一个客户端,一个系统端分别位于前端和后端.但是,这现在引入了对非阻塞套接字的需求.我一直在阅读这里的教程,解释如何在主线程中安全地使用Selector来处理所有带连接的线程.

但是,我需要的是多个选择器 - 每个选择器都在自己的线程中运行.通过阅读上述教程,我了解到Selector中的键集不是线程安全的.这是否意味着在我们自己的repsective线程中实例化的单独选择器可能会创建冲突的密钥,如果我尝试给它们各自的一对套接字和通道?将选择器移动到主线程的可能性很小,但根据我已经给出的软件要求,它远非理想.谢谢您的帮助.

java multithreading nio css-selectors

6
推荐指数
1
解决办法
7396
查看次数

如何从MIDISourceCreate()保留虚拟MIDI源的唯一性?

我正在使用RtMidi作为OS X上CoreMIDI的包装来从应用程序发送MIDI消息.我使用RtMidiOut::openVirtualPort("MyAwesomePort")这样我可以选择我的应用程序作为DAW中的输入源.

但是,如果我的程序关闭并且我再次打开它,我的DAW不会将输入设备识别为相同的端口,尽管给出了相同的名称.

我最初使用的是pyrtmidi,因此用RtMidi直接验证了用C++编写的行为.在这种情况下,"我的DAW"是Reaper 4,但我复制了Pro Tools,Logic和MuLab中的行为.

我知道可以保留虚拟midi端口的一些独特性,因为MidiKeys的行为就像我希望我的应用程序一样:即使MidiKeys在我的DAW仍在运行时关闭并重新打开,我的DAW也会记住它.

所以我挖掘了RtMidi源代码,CoreMIDI封装器看起来很简单.所MIDISourceCreate要求的只是一个字符串.客户端参数是(我在浏览文档后假设的)我的应用程序的标识符,它是CoreMIDI服务的客户端.

void RtMidiOut :: openVirtualPort( std::string portName )
{
  CoreMidiData *data = static_cast<CoreMidiData *> (apiData_);

  if ( data->endpoint ) {
    errorString_ = "RtMidiOut::openVirtualPort: a virtual output port already exists!";
    error( RtError::WARNING );
    return;
  }

  // Create a virtual MIDI output source.
  MIDIEndpointRef endpoint;
  OSStatus result = MIDISourceCreate( data->client,
                                      CFStringCreateWithCString( NULL, portName.c_str(), kCFStringEncodingASCII ),
                                      &endpoint );
  if ( result != noErr ) {
    errorString_ = "RtMidiOut::initialize: error creating …
Run Code Online (Sandbox Code Playgroud)

macos midi core-audio ios coremidi

6
推荐指数
1
解决办法
1342
查看次数

C++删除c-strings数组/其他类型的数组

[编辑]

好的,这是有道理的,谢谢sharptooth和CashCow.您不能删除分配为const的数据,这会使字符串文字无法解决.所以,如果我将初始化更改为如下所示:

char **groups = new char*[2];

char *s1 = new char[10];
char *s2 = new char[10];
char c1 = 'a';
char c2 = 'b';
for(int i = 0; i < 9; i++)
{
    s1[i] = c1;
    s2[i] = c2;
}
s1[9] = NULL;
s2[9] = NULL;

groups[0] = s1;
groups[1] = s2;
Run Code Online (Sandbox Code Playgroud)

硬代码我的for循环使它只迭代i = 1和i = 2,然后一切正常.

我注意到,int arraySize = sizeof arr / sizeof *arr;当数组分配new []而不是local时,似乎只能工作.这是因为我的原始char ** groups;变量衰减到指针,对吧?

现在我想知道,无论如何判断数据是否为常量?


[原版的]

我知道数组和指针是邪恶的,并且有一些称为向量和链表的伟大事物.

但是,在内存管理方面,我是一个新手,我感觉有点自虐.假设我创建一个C字符串数组.我知道,从这个问题 …

c++ memory-management cstring new-operator

4
推荐指数
1
解决办法
5681
查看次数

为什么RelayCommand <T> .Execute采用对象而不是T?

这没有做任何事情,但导致需要不必要的投射(或者更确切地说,导致我下拉代码库并自己进行更改).这样做是否有理由?

参考文献:

Codeplex上的源代码

博客发布源代码

编辑 这是一个例子:

DoCommand = new RelayCommand<AsyncCallback>((callBack) =>
{
    Console.WriteLine("In the Action<AsyncCallback>");
    SomeAsyncFunction((async_result) =>
    {
        Console.WriteLine("In the AsyncCallback");
        callBack.Invoke(new MyAsyncResult(true));
    });
});

DoCommand.Execute((iasyncresult) => Console.WriteLine(iasyncresult.IsCompleted));
//Where MyAsyncResult is a class implement IAsyncResult that sets IsCompleted in the constructor
// This will cause the "cannot cast lambda as object" error
Run Code Online (Sandbox Code Playgroud)

c# silverlight mvvm relaycommand

2
推荐指数
1
解决办法
962
查看次数