2011-02-04 31 views
0

我有一個GUI應用程序,它有一個主線程,然後當用戶單擊「開始」按鈕時,我使用NSOperation運行2個其他線程。現在一個線程計算一個特定的值並更新它。我想讓線程2做的是選擇這個值並更新UI。 如何從第二個線程獲取IBOutlet Textfield值以更新UI?從另一個.m文件更新Cocoa中的UI

如: 的main.m ---處理UI和具有代碼​​,當用戶點擊開始按鈕,啓動2個線程。

thread1.m - 計算一個特定的值,並一直這樣做,直到用戶點擊停止。

thread2.m - 需要使用此線程與該thread1.m計算值的main.m更新UI。

我無法完成的任務thread2.m和更新UI。我的問題是,如何定義IBOutlet並使用thread2/1中的值進行更新,以便main.m可以訪問此值並更新UI。我可以訪問main.m中的實際變量,並可以使用NSLog將其打印出來。它只是我陷入如何更新用這個值的用戶界面。因爲我需要在main.m中配置IBOutlet以將其與應用程序中的UILabel綁定。任何想法傢伙?謝謝。

回答

0

你可以添加指向你的thread1.m和thread2.m文件的指針嗎?然後用一個構造函數方法或一些存取方法設置它們?

如果我理解你在你的例子所描述的情況,並假設你正在計算是一個int(您可以修改,因爲你需要):

添加訪問器thread1.m

-(int)showCurrentCalcValue 
{ 
    //Assume that you get calculatedValue from whereever else in your thread. 
    return calculatedValue; 
} 

然後添加到thread2.m

NSTextField *guiTextField; 
Thread1 *thread1; 

-(void) setThread: (Thread1 *aThread) 
{ 
    self.thread1 = aThread; 
} 

-(void) setGuiTextField: (NSTextField *aTextField) 
{ 
    self.guiTextField = aTextField; 
} 

-(void) updateGUI() 
{ 
    [guiTextField setStringValue: [thread1 showCurrentCalcValue]]; 
} 

意味着你的main.m文件是類似如下:

IBOutlet NSTextField *outputDisplay 

-(void) setUpThreads() 
{ 
    Thread1 *thread1 = [[Thread1 alloc] init]; 
    Thread2 *thread2 = [[Thread2 alloc] init]; 

    [thread2 setGuiTextField: outputDisplay]; 
    [thread2 setThread: thread1]; 
    //Whatever else you need to do 
} 

然後就打理一切的設置和調用你的線程的方法。

+0

謝謝瑞恩。我如何在我的main.m中訪問guiTextField?我可以在thread1.m中獲得該值(完全像您提到的那樣)。但是我遇到的問題是如何將此值存儲在可由main.m訪問的NSTextfield中?如果我在thread2.m中聲明它,main.m將不會看到它。 – ZionKing 2011-02-04 21:32:19

0

源代碼文件無所謂。你可以在一個文件中包含所有這些東西(這不是一個好主意),問題將不會改變。重要的是這些課程。

類不是簡單的代碼包;你設計它們,你命名它們,並且你定義每個班級的職責範圍。一個類和/或它的實例做某些事情;你可以定義這些東西是什麼,不是。

當寫的NSOperation子類,不用擔心線程。不能保證他們甚至可以在單獨的線程上運行。每個操作只是一個工作單元;你寫一個操作去做一件事,不管可能如何。

例如:--- main.m文件處理界面,並具有代碼,啓動2個線程 - 當用戶點擊開始按鈕 -

操作

thread1.m - 計算一個特定的值,並一直這樣做,直到用戶點擊停止。

這不是一回事;這是一個不確定的事情序列。

thread2.m - 需要使用此線程使用thread1.m計算的值更新main.m中的UI。

您不應該觸摸輔助線程(可能是什麼)的UI。請參閱Threading Programming Guide,尤其是線程安全摘要。

我不明白爲什麼這甚至應該連線。在主線程上運行的NSTimer可以更輕鬆地完成這一切。

如果在主線程上「計算...特定值」是不合適的,那麼您可以進行該操作。您對計時器消息的響應將創建一個操作並將其添加到您的計算隊列中。當用戶停止時,該動作將通過主線程;使計時器無效並等待隊列完成其餘所有操作。

使用任一解決方案,「thread2.m」完全消失。您的UI更新將(並且必須)完全發生在主線程上。採用後一種解決方案,您甚至不必等到完成之後;您每次收到定時器消息時都可以使用當前進度信息更新UI。

相關問題