2011-04-20 79 views
0

通過調用synchronize方法改變Editbox的值,是否可以通過OnChange事件Editbox獲得線程響應的正確方法?我可以使用Editbox的OnChange事件來處理線程嗎?

事情是這樣的:

//Extra Thread 
procedure HThread.Execute; 
begin 
    Synchronize(CallGUI); 
end; 

procedure HThread.CallGUI; 
begin 
    Edit.Text = 'Hello'; 
end; 


//Main Thread 
procedure Main; 
begin 
    Tr := HThread.Create(true); 
    Tr.Edit := Form1.Edit1; 
    Tr.Resume; 
end; 

procedure TForm1.Edit1Change(Sender: TObject); 
begin 
    ShowMessage('Response from extra thread :' + Edit1.text); 
end; 
+0

您是否可以編輯問題以添加事件的時間線樣式描述?我不清楚你想做什麼,因爲一個'TEdit.OnChange'響應於編輯框的變化而觸發,並且在主線程中。同步方法是您在後臺線程中使用的某些內容在主VCL線程中發生的事情,而不是您從OnChange調用的內容。 – 2011-04-20 10:41:57

+0

編輯問題 – Kermia 2011-04-20 11:19:21

+0

您的問題標題與問題主體不匹配(OnChange事件處理程序不處理與線程相關的任何事情)。你發佈的代碼不能編譯,所以我們不能真正猜到你在做什麼。忽略編譯器錯誤,不禁要問,爲什麼不直接從'CallGUI'調用'ShowMessage'。也許你應該解釋你想要做什麼,就像在「最終目標」中一樣。 – 2011-04-20 11:33:45

回答

2

假設您在線程中更改通過Synchronize()調用的過程中的EditBox文本值,將在GUI線程中執行分配的OnChange事件。這將毫無問題地工作,但會停止處理事件的線程單元。

0

通過Synchronize()改變UI的東西是正確的方式,如果你是這個意思。但我不確定我是否理解了其他問題。

3

您使用的TEdit是麻煩,因爲有兩個原因:

  • 它看起來像你使用TEdit作爲從線程數據傳輸的地方(在OnChange事件處理程序的依賴使得我認爲需要更多的處理,TEdit不被用作簡單的「輸出區域」)。 GUI元素不應該用於數據存儲,因爲無數的原因,從性能到OOP封裝以及依賴於您的控制之外的算法。
  • 依靠OnChange事件處理程序在編程式更改文本時觸發,這取決於TEdit的實現細節。如果微軟決定不以編程方式進行更改,則不會觸發OnChange事件?或者Embarcadero決定有條件地不表示它,因爲程序員不需要被通知只是改變了那個值?

除此之外,您使用Syncronize()將可能工作,即「您可以使用它」,但我會說這不是一個好主意。我想建議一個更好的解決方案,但不能這樣做,因爲我不知道你在做什麼。如果你想要做的只是強制OnChange被解僱,那麼保留你的代碼。

+0

這只是一個簡單的方法,現在運行良好。 – Kermia 2011-04-20 12:03:29

相關問題