2014-10-19 13 views
7

Come posso verificare se il thread su cui sto lavorando è il thread di Unity?Scopri se sono sul thread di unità

Ho provato a catturare il threadId al momento del costruttore, ma da qualche parte lungo la durata del programma, il threadId si sposta.

Nel mio progetto, alcuni processi di thread secondari devono accedere a un oggetto appena creato.
Uso il modello produttore-consumatore in modo che possano essere creati sul thread Unity. Un oggetto factory accoda una richiesta e su Update() gli oggetti che ho richiesto vengono istanziati sulla thread corretta. Tra In coda e Istanziato, il metodo factory attende un evento ObjectCreated con un AutoResetEvent.

Ora a volte questo factory verrà chiamato dal thread principale e AutoResetEvent bloccherà il proprio thread. Ho provato anche il modo sporco con

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

Ma quando l'unità genera l'eccezione, catturato o no, il programma si ferma.

Se potessi verificare se sono nella discussione corretta, potrei passare dalla coda alla semplice esecuzione.

+0

Non ho mai visto il cambiamento della discussione principale, come stai ottenendo il valore? 'System.Threading.Thread.CurrentThread.ManagedThreadId' funziona per me e non cambia per quanto riguarda i miei test. Inoltre, l'esecuzione di codice con thread nella modalità di anteprima di Unity Editor può comportare un comportamento imprevisto. – Jerdak

+0

System.Threading.Thread.CurrentThread.ManagedThreadId sembra cambiare da ciò che è in fase di costruzione e da quale parte si trova a metà corsa. Non conosco nessun dettaglio Ho letto da qualche parte che potrebbe avere qualcosa a che fare con l'editor. Cercando di essere meno vago, ma non ho ancora trovato un modello. –

+0

Sono scettico sul fatto che il filo conduttore di Unity possa mai cambiare. Ciò suggerirebbe di bloccare il ciclo degli eventi principale, di copiare tale stato in un nuovo thread e di riavviare il ciclo. Unity non supporta il multithreading, quindi è difficile immaginare perché potrebbero progettare una cosa del genere. Se sviluppi un esempio funzionante del problema, sarebbe bello vederlo. – Jerdak

risposta

8

ho risolto catturando l'intero thread e quindi eguagliando in questo modo:

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

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

correlati: http://answers.unity3d.com/questions/62631/i-wonder-about-thread-id-plz-answer-me.html

+0

Si noti che 'Update()' viene sempre chiamato sul thread principale, quindi controllare se sei nel thread principale in 'Update()' risulterà sempre in 'true'. Modificherò la risposta per controllarla in una funzione che può essere chiamata da qualsiasi thread. – Tom