我使用D的std.process.pipeProcess函数生成一个进程,该函数分别为进程的输入和输出提供了std.stdio.File结构。我需要能够处理来自进程的输出,同时处理来自我自己的控制台的输入。
由于无法在File结构上执行非阻塞readln(),我需要生成另一个线程来对我进行阻塞等待,然后消息通过std.concurrency将其传递给主线程。
我的问题是,当我这样传递时:
spawn(&myConsoleListenFunction, pipe.stdout)
编译器说“不允许使用可变线程本地数据的别名”。我知道这意味着我需要转换为共享,但我不能这样做,因为当我尝试将文件转换为共享时我得到了这个:
C:\D\dmd2\windows\bin\..\..\src\phobos\std\concurrency.d(487,5): Error: non-shared method std.stdio.File.~this is not callable using a shared object
source\app.d(67,26): Error: template std.concurrency.spawn cannot deduce function from argument types !()(void function(File f, string prefix), shared(File), string), candidates are:
C:\D\dmd2\windows\bin\..\..\src\phobos\std\concurrency.d(487,5): std.concurrency.spawn(F, T...)(F fn, T args) if (isSpawnable!(F, T))
我也尝试将文件作为__gshared传递,这会产生相同的“别名”消息。