RandomAccessFile не работает с Minecraft Forge - PullRequest
0 голосов
/ 16 декабря 2018

Сейчас я работаю над модом для Minecraft с выделенной системой графического интерфейса, написанной на C ++ и Qt5.Я позволил моему GUI и Minecraft общаться через именованный канал, но у меня возникла небольшая проблема.Я могу читать и писать с помощью простой программы на Java и C ++ (Qt) в трубу.Но когда я создаю новый экземпляр моего класса Pipeendpoint в пост-инициализации Minecraft Forge, он не может ничего прочитать из Pipe.В автономной системе он может читать вещи.

Не работает. Forge:

package de.CoderDE.CodersAnimationEditor;

import java.io.FileNotFoundException;

import de.CoderDE.CodersAnimationEditor.Pipe.PipeEndpoint;
import net.minecraft.client.Minecraft;
import net.minecraftforge.fml.client.registry.ClientRegistry;
import net.minecraftforge.fml.common.event.FMLInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPostInitializationEvent;
import net.minecraftforge.fml.common.event.FMLPreInitializationEvent;
import net.minecraftforge.fml.relauncher.Side;
import net.minecraftforge.fml.relauncher.SideOnly;

@SideOnly(Side.CLIENT)
public class ClientProxy extends CommonProxy {
    static PipeEndpoint pendpoint;

    @Override
    public void preInit(FMLPreInitializationEvent e) {
        super.preInit(e);
    }

    @Override
    public void init(FMLInitializationEvent e) {
        super.init(e);
    }

    @Override
    public void postInit(FMLPostInitializationEvent e) {
        super.postInit(e);

        try {
            pendpoint = new PipeEndpoint();
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }

        try {
            Thread.sleep(10000);
        } catch (InterruptedException e1) {
            e1.printStackTrace();
        }
    }
}

Работает автономная реализация:

import java.io.FileNotFoundException;

import de.CoderDE.CodersAnimationEditor.Pipe.PipeEndpoint;


public class Main {
    static PipeEndpoint pipe;

    public static void main(String[] args) {
        try {
            pipe = new PipeEndpoint();
        } catch (FileNotFoundException e1) {
            e1.printStackTrace();
        }

        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

И важный класс PipeEndpoint:

package de.CoderDE.CodersAnimationEditor.Pipe;

import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.RandomAccessFile;

public class PipeEndpoint {
    private Thread reciever;
    private RandomAccessFile pipe;

    public PipeEndpoint() throws FileNotFoundException {
        pipe = new RandomAccessFile("\\\\.\\pipe\\CodersAnimationEditor", "rw");
        reciever = new Thread(new PipeEndpointReciever());
        reciever.start();
    }

    private class PipeEndpointReciever implements Runnable {
        @Override
        public void run() {
            try {
                while (true) {
                    System.out.print((char)pipe.read());
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

А с "не могу ничего прочитать" я имею в виду, что он никогда не возвращается из pipe.read ().Да, и Java-приложение запускается после того, как C ++ (Qt) LocalServer начал прослушивание и ждет нового соединения.

...