一个程序"sit and wait"如何在程序是运行的情况下进行输入? (概念上)

How does a program "sit and wait" for an input while the program is running? (Conceptually)

我试图从概念上理解任何程序如何在 运行 期间“监视”或“等待”用户输入,并在给出输入后继续 运行...甚至,“程序是运行ning”是什么意思? 当计算机读取所有指令行时,是什么让程序坐下来等待而不结束执行?是否有一组等待某些特定输入的无限循环?

我是一名网络开发人员(但我没有在技术大学学习),我想这个概念在信息学中是一个相当低的水平,但我认为对于任何类型的软件开发人员来说,获得更好的直觉都非常重要在本主题中。

存在程序一直查询的无限循环。例如,在Windows上,所有程序(包括网络浏览器)中都有以下内容:

MSG msg = { };
while (GetMessage(&msg, NULL, 0, 0))
{
    TranslateMessage(&msg);
    DispatchMessage(&msg);
}

你有一个消息队列,当事件发生时,它会充满消息。调度消息会将消息调度到一个通用过程(一个特殊函数),该过程打开消息以确定它是什么并根据情况采取行动。过程可能如下所示:

LRESULT CALLBACK MainWndProc(
    HWND hwnd,        // handle to window
    UINT uMsg,        // message identifier
    WPARAM wParam,    // first message parameter
    LPARAM lParam)    // second message parameter
{ 
 
    switch (uMsg) 
    { 
        case WM_CREATE: 
            // Initialize the window. 
            return 0; 
 
        case WM_PAINT: 
            // Paint the window's client area. 
            return 0; 
 
        case WM_SIZE: 
            // Set the size and position of the window. 
            return 0; 
 
        case WM_DESTROY: 
            // Clean up window-specific data objects. 
            return 0; 
 
        // 
        // Process other messages. 
        // 
 
        default: 
            return DefWindowProc(hwnd, uMsg, wParam, lParam); 
    } 
    return 0; 
} 

每个程序都需要使用Windows提供的低级API来绘制或创建windows。否则,它无法访问硬件。大多数情况下,创建软件的公司会通过使用其他高级语言或创建自己的窗口框架来从这种低级别 API 中抽象出来,然后可以使用这些框架来创建 windows 小部件和其他东西.

下面,GetMessage() 函数检索可用于调用线程的消息。 Windows 可能为每个线程保存一个消息队列,当调用 GetMessage() 时,队列递减一条消息,用于填充 msg 结构。

真的就这么简单。如需更多信息,请随时发表评论!