在我目前的项目中,我被困在解决一个问题上。我用WPF/C#编写了一个模拟程序,并在窗口中包含了一个Unity,使用window-handles/hwnd,就像“程序员”在这个回答中所做的那样。他还提出了通信的名称管道。
但是通信只是以一种方式工作--服务器(WPF-App)能够向客户端(嵌入式统一应用程序)发送消息。如果我用相反的方法尝试,整个Unity就会停止工作。据我所知,只要我冲洗作者或添加AutoFlush,然后写东西,团结就卡住了。
有趣的是,服务器的InBufferSize是0。这可能是问题所在吗?
这是分配给GameObject的统一中的C#-脚本:
public class pipeCommunicationScript : MonoBehaviour
{
NamedPipeClientStream client;
public GameObject console;
static Text consoleText;
StreamReader reader;
StreamWriter writer;
int counter = 0;
static bool _threadRunning;
Thread _thread;
void Start()
{
consoleText = console.GetComponent<Text>();
consoleText.text = "trying to set up client";
_thread = new Thread(StartClient);
_thread.Start();
}
void StartClient()
{
_threadRunning = true;
//Client
consoleText.text = "Attempting to connect to pipe...";
client = new NamedPipeClientStream(".","UnitySimulationPipe", PipeDirection.InOut);
if (!client.IsConnected) { client.Connect(); }
consoleText.text = "Connected to pipe.";
writer = new StreamWriter(client);
reader = new StreamReader(client);
writer.AutoFlush = true;
InvokeRepeating("sendThroughPipe", 5.5f, 5.5f);
while (_threadRunning)
{
consoleText.text = "IN:" + reader.ReadLine();
}
_threadRunning = false;
}
void sendThroughPipe()
{
try
{
client.WaitForPipeDrain();
writer.WriteLine("test" + counter);
}
catch(Exception e)
{
consoleText.text = "Exception while sending: " + e;
}
consoleText.text = "OUT: test" + counter;
counter++;
}
void OnDisable()
{
if (_threadRunning)
{
_threadRunning = false;
_thread.Join();
}
}
}这是我的服务器脚本:
void StartServer()
{
Task.Factory.StartNew(() =>
{
Console.WriteLine("Connection initialisation started");
var server = new NamedPipeServerStream("UnitySimulationPipe", PipeDirection.InOut);
server.WaitForConnection();
while (!server.IsConnected)
{
Console.WriteLine("Connection not initialized");
server.WaitForConnection();
}
Console.WriteLine("Connection initialized");
reader = new StreamReader(server);
writer = new StreamWriter(server);
writer.AutoFlush = true;
writer.WriteLine("startConnection");
printOnStatusBar("OUT: startConnection");
connected = true;
Console.WriteLine("Current pipe readable: " + server.CanRead);
Console.WriteLine("Pipe InBufferSize: " + server.InBufferSize);
while (true)
{
Console.WriteLine("start while again");
if (reader.Peek() > 0)
{
var l = reader.ReadLine();
Console.WriteLine(reader.ReadLine());
Console.WriteLine("read finished");
server.WaitForPipeDrain();
}
Thread.Sleep(500);
}
});
}发布于 2020-06-09 09:41:05
最可能的答案是,事实上,你提到了什么(bufferSize)。您应该检查您使用的每个对象的初始化程序参数。别担心,我相信你只要在那里搜索就能找到答案。我曾经用同样的方式创建这样的代码,它应该工作得很好。
发布于 2020-06-09 17:04:11
好的,我将服务器对象的初始化更改为(对不同参数这里的解释):
var server = new NamedPipeServerStream("UnitySimulationPipe", PipeDirection.InOut, 1, 0, 0, 1024, 1024);但我个人认为,这只是一个小错误。我的代码不起作用的主要原因是,我错过了调用
server.WaitForPipeDrain();之后
writer.WriteLine("startConnection");
printOnStatusBar("OUT: startConnection");在我的服务器密码里。
https://stackoverflow.com/questions/62277845
复制相似问题