2014-10-19 10 views
7

Làm cách nào để kiểm tra xem chuỗi mà tôi đang truy cập có là chuỗi Unity không?Tìm hiểu xem tôi có nằm trong chủ đề hợp nhất

Tôi đã thử chụp chuỗi tin nhắn tại thời gian khởi tạo, nhưng ở đâu đó trong suốt thời gian tồn tại của chương trình, chuỗi di chuyển sẽ chuyển.

Trong dự án của tôi, một số quy trình chuỗi phụ cần quyền truy cập vào đối tượng mới được tạo.
Tôi sử dụng mẫu người tiêu dùng sản xuất để có thể tạo mẫu trên chuỗi Unity. Một nhà máy đối tượng xếp hàng một yêu cầu và trên Update() các đối tượng mà tôi yêu cầu được khởi tạo trên chuỗi chính xác. Giữa Queued và Instantiated phương thức factory chờ đợi một sự kiện ObjectCreated với một AutoResetEvent.

Đôi khi, nhà máy này sẽ được gọi từ chuỗi chính và AutoResetEvent sẽ chặn chuỗi của chính nó. Tôi cũng đã cố gắng điều đó một cách bẩn với

// First try on this thread 
try 
{ 
    return action(); 
} 
catch (ArgumentException ex) 
{ 
    Debug.Log("Tried on same thread, but failed. "+ex.Message); 
} 
PushToQueueAndWait(action); 

Nhưng khi đoàn kết ném ngoại lệ, bắt hay không, chương trình ngừng.

Nếu tôi có thể kiểm tra xem mình có đang ở đúng chuỗi không, tôi có thể chuyển giữa xếp hàng và chỉ thực hiện.

+0

Tôi chưa bao giờ nhìn thấy sự thay đổi threadid chính, làm thế nào bạn nhận được giá trị? 'System.Threading.Thread.CurrentThread.ManagedThreadId' làm việc cho tôi và không thay đổi trong khi thử nghiệm của tôi đi. Ngoài ra, việc chạy mã chuỗi trong chế độ xem trước của Trình chỉnh sửa của Unity có thể dẫn đến hành vi không mong muốn. – Jerdak

+0

System.Threading.Thread.CurrentThread.ManagedThreadId dường như thay đổi so với thời gian khởi tạo và nó ở đâu đó nửa chừng đang chạy. Không biết bất kỳ chi tiết nào. Tôi đã đọc ở đâu đó rằng nó có thể có một cái gì đó để làm với các biên tập viên. Cố gắng bớt mơ hồ, nhưng vẫn chưa tìm thấy một mẫu. –

+0

Tôi hoài nghi rằng chủ đề chính của Unity có thể thay đổi. Điều đó sẽ cho thấy nó đóng băng vòng lặp sự kiện chính, các bản sao có trạng thái đến một luồng mới và bắt đầu lặp lại vòng lặp. Unity không hỗ trợ đa luồng nên khó có thể tưởng tượng được tại sao họ lại tạo ra một thứ như vậy. Nếu bạn phát triển một ví dụ làm việc của vấn đề nó sẽ là tuyệt vời để xem. – Jerdak

Trả lời

8

tôi giải quyết nó bằng cách nắm bắt được toàn bộ chủ đề và sau đó bằng nó như vậy:

public void Start(){ 
    mainThread = System.Threading.Thread.CurrentThread; 
} 

bool isMainThread(){ 
    return mainThread.Equals(System.Threading.Thread.CurrentThread); 
} 

liên quan: http://answers.unity3d.com/questions/62631/i-wonder-about-thread-id-plz-answer-me.html

+0

Lưu ý rằng 'Update()' luôn được gọi trên chuỗi chính, vì vậy hãy kiểm tra cho dù bạn đang ở trên luồng chính trong 'Update()' sẽ luôn dẫn đến 'true'. Tôi sẽ chỉnh sửa câu trả lời để kiểm tra nó trong một hàm có thể được gọi từ bất kỳ chuỗi nào. – Tom

Các vấn đề liên quan