2012-03-28 80 views
0

要創建並顯示錶單需要10秒鐘,而且我想縮短處理時間。創建表單的優化

在部分是

Inherited Create(AOwner); 

哪需要2秒的總運行時間。

有沒有一種方法可以縮短Delphi TForm的父創建? 或者你知道是什麼的時間在通話

Inherited Create(AOwner); 

增加的原因?

更新:我沒想到有18條評論和3條答案:D謝謝大家的回覆。

在當前狀態下,我厭倦了一些圍繞此處的配置文件,而非導致代碼中的實際代碼行,它主要是內核調用或系統調用。

所以買隨AQTime德爾福XE2後,我嘗試升級項目德爾福XE2,現在需要幾天的時間。(大項目)

生病添加信息,因爲我得到的信息探查。

順便說一句,在Windows服務器域之外,使得動作慢兩倍。因爲內部計算機在5秒鐘內運行。這要好得多,但仍然很慢。

Update2:使用Delphi XE2進行編譯和運行,比Delphi 2009的時間優先性提高了近20%.AQTime沒有產生任何有用的信息。

update3:左邊xe2,不穩定。回到2009 Delphi的構造

SendMessage(application.Handle, WM_SETREDRAW, 0, 0); 

的起點,也在構造的盡頭有試圖

SendMessage(application.Handle, WM_SETREDRAW, -1, 0); 
    form.Repaint; 

降低0.1秒。

+7

當我這樣做時,表單即刻創建。顯然你的代碼和我的代碼不同。我知道我的代碼是幹什麼的,但我不知道你的代碼是什麼。 – 2012-03-28 15:23:43

+1

@none如果你有很多,我的意思是表單上有許多**可視化組件,你的應用程序可能需要很長時間才能創建基於* .dfm資源的表單,所以在這種情況下使用代碼創建組件可以提高速度,但這會是一個矯枉過正的問題。你使用多個表單繼承嗎​​?一些關於你的表單的OnCreate中發生了什麼的代碼會有所幫助,我認爲這是由於某些數據庫連接保持打開狀態? – ComputerSaysNo 2012-03-28 15:27:40

+0

@DorinDuminica是的,表單包含超過一百個可視化組件。 Constractor本身是巨大的,我試圖孤立一個問題。 – none 2012-03-28 15:30:54

回答

9

看見濫用擠滿了零部件業務形式經驗:

  1. 數據庫活動:你必須是活躍,並要求DB打開和/或取數據DB組件。顯而易見的是,當您的表單在設計時包含DBConnections或DataSet時處於活動狀態,或者,您可能會偷偷摸摸地將某些DataSources鏈接到某個DataSources(位於DataModule中),並將這些組件保留爲活動狀態,這些組件就像TDBEdit一樣。
    補救措施:在設計時將所有數據集和連接設置在Active=False中,並在第一次需要時激活。事件處理程序(或者他們調用/觸發其他緩慢/長時間的)組件。最經常看到的是諸如處理大型INI文件,大量XML存儲或Excel電子表格等文件操作。
    補救措施:狩獵他們,並試圖推遲,直到你真的需要他們。

  2. 不必要的事件處理程序調用:在創建(並經常互相調用)的事件被觸發多次對沒有有用的原因。使用分析器來檢測和計數。
    補救措施:關閉事件直到它們有用。

不得已招:如果你不能使它更快,改變用戶的感知。
將一個快速打開的啓動畫面放在一起看,或閱讀,可以與您的MainForm開幕同時佔用用戶的注意力。

2

使用一個名爲AQTime的分析器,並找出什麼是緩慢的。這裏沒人能猜到你在做什麼,對你來說很慢。

+0

我會那樣做,謝謝。 – none 2012-04-02 15:35:30

1

我看過你有很多很多組件。所以我的猜測是,初始化所有這些組件佔用的時間不是表單創建本身(通常需要幾ms)。

首先:也許你已經知道這一點,但如果沒有,使用一個分析器,以確定您的形式是什麼成分給予延遲。是表填料只叫一次或多次..

如果大部分這些組件是控制:你應該重構代碼,併爲每個部分的一些幀。每當第一個零件變得可見時,您就可以及時創建所需的框架。當你有選項卡或類似的東西時,這種效果最好,當不是所有的東西都可以同時看到的時候。

如果大部分成分是不可視的,你可能會激活它們只是在時間,動態地創建他們,如果他們沒有一個屬性來激活/關閉它們。

如果可能的話,如果某些查詢需要讀取(從數據庫或文件或其他)數據,試圖加載在另一個線程的數據和空白表單的某些部分,直到數據是存在的。你需要的所有數據馬上等等等等

但還是:最重要的是:知道什麼是消耗所有的時間。