调用函数比SendMessage()更快?

时间:2015-08-27 22:22:17

标签: c winapi

调用的函数与发送的邮件的作用相同,而不是调用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;
}

1 个答案:

答案 0 :(得分:8)

直接调用此函数比通过SendMessage调用更快。

当您查看SendMessage的作用时,可以很容易地推断出这一点:首先需要确定目标窗口是否属于同一个线程,如果是,则检索窗口过程,最后调用这一点。

如果目标窗口由另一个线程拥有,则代价更高,因为SendMessage调用必须在目标线程的队列中排队消息,等待它调用消息检索函数,并且只能在目标线程调度消息并生成返回值时返回。但是,在这种情况下,调用SendMessage 强制。从拥有线程以外的线程操作窗口会导致未定义的行为。 SendMessage确保操作在拥有窗口的同一线程上运行。

此外,编译器可以内联直接函数调用。调用SendMessage时无法做到这一点,因为编译器无法看到它的实现。

性能不是问题:您正在响应用户输入。用户是瓶颈。另一方面,正确性至关重要。如果需要决定,请使用以下规则:如果您正在操作的窗口由调用线程以外的线程拥有,请使用SendMessage。如果窗口由调用线程拥有,请进行直接函数调用。