调用函数比SendMessage()更快?

Mik*_*2ab 0 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;
}
Run Code Online (Sandbox Code Playgroud)

IIn*_*ble 8

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

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

如果目标窗口由另一个线程拥有,则它会变得更加昂贵,因为SendMessage调用必须在目标线程的队列上排队消息,等待它调用消息检索功能,并且只能在目标线程具有时返回调度消息并生成返回值.但是,在这种情况下,必须打电话SendMessage.从拥有线程以外的线程操作窗口会导致未定义的行为.SendMessage确保操作在拥有窗口的同一线程上运行.

另外,编译器可以内联直接函数调用.调用时这是不可能的SendMessage,因为编译器无法看到它的实现.

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

  • 很好的答案,我只是强调,确切地说,消息可能被抽到窗口过程这一事实可以比直接API函数调用强大 - 如果我们尝试从辅助更新UI,这是相关的例如,线程.直接在辅助线程中调用该函数可能会锁定或崩溃应用程序,而SendMessage()是一种非常安全的方法. (2认同)