2010-10-13 62 views
0

如何在另一個線程中的窗口中的列表框中添加一個條目。 我的問題是,我必須線程。 一個工作線程,它執行所有實際工作,併爲要顯示狀態信息的窗口執行一個線程。 我試圖在構造函數中傳遞表單窗口作爲參數,但是當我調用它時,我得到一個異常。在另一個線程中訪問表單窗口

下面是我的一些代碼來說明這個問題:

public partial class Mainform : Form 
{ 
    private string db = String.Empty; 
    private string password = String.Empty; 
    private string sqlinifile = String.Empty; 
    DatabaseListener dbListener; 
    StatusWindow statusWindow; 

    public Mainform() 
    { 
     // 
     // The InitializeComponent() call is required for Windows Forms designer support. 
     // 
     InitializeComponent(); 

     // 
     // TODO: Add constructor code after the InitializeComponent() call. 
     // 
     db = "EWAG"; 
     password = "secret"; 
     sqlinifile = "C:\\Programme\\Unify\\Team Developer 5.2\\sql.ini"; 
     textBoxDB.Text = db; 
     textBoxPwd.Text = password; 
     textBoxSqlIni.Text = sqlinifile; 

     statusWindow = new StatusWindow(); 
     dbListener = new DatabaseListener(statusWindow); 
    } 

    public void threadStarter() 
    { 
     this.dbListener.startSynchronizing(5); 

    } 
    void Button1Click(object sender, EventArgs e) 
    { 
     this.db = textBoxDB.Text; 
     this.password = textBoxPwd.Text; 
     this.sqlinifile = textBoxSqlIni.Text; 

     if (dbListener.connectToDatabase(db,"sysadm", password, sqlinifile)) 
     { 
      this.Hide(); 
      statusWindow.Show(); 
      Thread synchronizer = new Thread(new ThreadStart(threadStarter)); 
      synchronizer.Start(); 

     } 
    }  

} 

回答

4

使用.Invoke(),盧克。

說真的,爲了與另一個線程的窗體上的某些控件進行交談,您必須使用Invoke()某種方法,以便與窗口句柄對話的屬性設置器被序列化爲主UI線程,並且它是消息泵。

或者,使用主UI線程上的計時器來收集信息並將它們放入列表框中。

或者使用混合方法,一個線程來收集數據,將它放入隊列中,但不會綁定到UI中,並使用計時器將其出列並在表單上顯示數據。我偶爾會使用它,因爲接收數據速率太大,會阻塞用戶界面。

0

除了使用調用(),請檢查是否需要與您要修改的對象的InvokeRequired屬性當前線程調用。您可以創建一個委託並通過使用下面的cod中的模式來創建一個方法threadsafe。

private delegate void LogLineDelegate(string ShortText, string LongText); 
    private void LogLine(string ShortText, string LongText) 
    { 
     if (this.InvokeRequired) 
     { 
      this.Invoke(new LogLineDelegate(LogLine), new object[] { ShortText, LongText }); 
      return; 
     } 
     sbLog.Append(string.Format("{0:MM-dd-yy} {0:HH:mm:ss.fff} - {1}: {2}.\r\n", DateTime.Now, ShortText, LongText)); 
     textBoxLog.Text = sbLog.ToString(); 
    } 
相關問題