2015-08-27 59 views
0

正在調用一個函數,它與發送消息的速度相同,比調用SendMessage()的速度更快?比SendMessage()更快地調用函數嗎?

例如,在下面的case WM_RBUTTONUP:代碼,這是更快的,主叫EnableTwoWindows(firstWnd, secondWnd);或發送SendMessage(hwnd, CUSTOM_MESSAGE_ENABLE_TWO_WINDOWS, 0, 0);?調用函數與發送消息有什麼優缺點?

void EnableTwoWindows(HWND hwnd1, HWND hwnd2) 
{ 
    EnableWindow(hwnd1, TRUE); 
    EnableWindow(hwnd2, TRUE); 
} 

LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    static HWND firstWnd, secondWnd; 

    switch(msg) 
    { 
    case CUSTOM_MESSAGE_ENABLE_TWO_WINDOWS: 
     EnableWindow(firstWnd, TRUE); 
     EnableWindow(secondWnd, TRUE); 
     break; 

    case WM_RBUTTONUP: 
     //EnableTwoWindows(firstWnd, secondWnd); //Is calling this function faster? or 
     //SendMessage(hwnd, CUSTOM_MESSAGE_ENABLE_TWO_WINDOWS, 0, 0); //Is sending message faster? 
     break; 

    case WM_DESTROY: 
     PostQuitMessage(0); 
     break; 

    default: 
     return DefWindowProc(hwnd, msg, wParam, lParam); 
    } 

    return 0; 
} 
+5

調用一個函數需要的代碼少於調用多個函數。我不明白你想問的問題。 – IInspectable

+0

@IInspectable我想知道哪個更快執行 – Mike32ab

+1

更多的代碼需要更多的時間來執行。你的問題與問道的道德等價:*「10比1大嗎?」*你已經知道答案。 – IInspectable

回答

8

直接調用函數比通過SendMessage調用要快。

當你看到SendMessage做什麼時,可以很容易地推斷出:它首先需要確定目標窗口是否屬於同一個線程,如果是,則檢索窗口過程,最後調用它。

如果目標窗口爲另一個線程所有,它將變得更加昂貴,因爲SendMessage調用必須在目標線程的隊列中排隊消息,等待它調用消息檢索函數,並且只能返回,當目標線程分派消息併產生一個返回值時。然而,在那種情況下,它是強制致電SendMessage。從擁有線程以外的線程操作窗口會導致未定義的行爲。 SendMessage可以確保操作在擁有窗口的同一個線程上運行。

另外,編譯器可以內聯直接函數調用。調用SendMessage時,這是不可能的,因爲編譯器無法看到它的實現。

性能不是問題:您正在響應用戶輸入。用戶是瓶頸。另一方面,正確性是至關重要的。如果需要決定,請使用以下規則:如果正在操作的窗口由調用線程以外的線程擁有,請使用SendMessage。如果窗口屬於調用線程,則直接進行函數調用。

+2

不錯的答案,我只強調,事實上,消息可能被泵送到窗口過程,可能是一個強大的優勢,直接API函數調用 - 這是相關的例如,我們正嘗試從輔助線程更新UI。在輔助線程中直接調用該函數可能會鎖定或崩潰應用程序,而SendMessage()是完全安全的方式。 – BlueStrat

3

是的。

調用多個函數比調用一個函數花費更多。

+0

呃 - 你得到了+3。當我提供'簡潔'的答案時,我得到了downvoted :( –

+0

那麼,但這個答案罷工之間指出了明顯的,並與我想不到的那種奇特的意想不到的Markdown功能之間的巧妙平衡在這裏啓用。 。 – stakx

+0

@MartinJames:我把它變成了一個CW(社區維基)的答案 - 正是因爲我不想指出明顯的信用。 –