내 응용 프로그램에서 스레딩 문제가 있습니다. 다중 스레드 클라이언트/서버 응용 프로그램이 있습니다. 또한 Unity3d에 C# MonoDevelop를 사용하고 있습니다. 대답에 차이가 있는지 확실하지 않습니다. 내 문제가 어디 있는지 설명하려고합니다 :C# 다른 스레드에서 코드 실행
단일 스레드에서 작동합니다. 따라서 추상적 클래스 인 ScriptableObject
을 사용하는 객체를 인스턴스화하려면 Unity가 실행되는 주 스레드에서 수행해야합니다.
그러나 내 서버 소켓은 연결된 모든 클라이언트에 대해 스레드를 생성하므로 들어오는 데이터를 비동기 적으로 처리 할 수 있습니다. 수신 된 데이터는 (자신의 실행 스레드에서)에있어서 OnDataReceived()
여기서 문제가 처리되고 난 OnDataReceived()
실 내부 Player
오브젝트의 인스턴스를 생성 할 수 있다는 것이다. 내 Player
개체가 ScriptableObject
에서 상속되기 때문입니다. 즉,이 객체가 주 Unity 스레드에서 만들어 져야 함을 의미합니다.
그러나 어떻게 해야할지 모르겠다 ... 메인 스레드로 다시 전환 할 수있는 방법이 있습니까? OnDataReceived()
메서드에서 개체를 만들 수 있습니까? 당신은
class Communicator
{
public static volatile bool CreatePlayer;
}
으로 그리고 소켓 코드에서 클래스를 통해 원래의 스레드와 통신 할 수
당신이 Ubity3d가 다른 스레드에서 만든 개체를 사용 못하게 확실합니까? –
@HenkHolterman 100 % 확신 할 수는 없지만 그 것처럼 보입니다. 다른 메소드/클래스에서 Player를 인스턴스화하면 모든 것이 잘 동작합니다. 하지만 내 소켓 클래스 (다른 스레드에서 실행되는)에서 그것을하려고하면 오류가 발생합니다 -> 오류 : 파일 : MonoManager.cpp at line : 2212 --- 그게 전부입니다. 그래서 이것은 다른 스레드에서만 발생하기 때문에 문제가 될 것이라고 생각했습니다. – w00
Unity3D를 사용하면 스레드간에 변수를 사용할 수 있습니다. 경주 조건처럼 들립니다. – Kay