QueueUserAPC 函数 (processthreadsapi.h)
将用户模式 异步过程调用 (APC) 对象添加到指定线程的 APC 队列。
语法
DWORD QueueUserAPC(
[in] PAPCFUNC pfnAPC,
[in] HANDLE hThread,
[in] ULONG_PTR dwData
);
参数
[in] pfnAPC
指向指定线程执行可警报等待操作时要调用的应用程序提供的 APC 函数的指针。 有关详细信息,请参阅 PAPCFUNC 回调函数。
[in] hThread
线程的句柄。 句柄必须具有 THREAD_SET_CONTEXT 访问权限。 有关详细信息,请参阅 Synchronization Object Security and Access Rights。
[in] dwData
传递给 pfnAPC 参数指向的 APC 函数的单个值。
返回值
如果该函数成功,则返回值为非零值。
如果函数失败,则返回值为零。 要获得更多的错误信息,请调用 GetLastError。 Windows Server 2003 和 Windows XP: 没有为此函数定义的错误值,可以通过调用 GetLastError 进行检索。
备注
有关特殊用户模式 APC 的信息,请参阅 QueueUserAPC2 函数 。
操作系统中提供的 APC 支持允许应用程序将 APC 对象排队到线程。 为了确保成功执行 APC 使用的函数,APC 应仅排队到调用方进程中的线程。
备注
出于多种原因,不建议将 APC 排队到调用方进程外部的线程。 当在调用方进程外执行函数时,DLL 重定可能导致 APC 使用的函数地址不正确。 同样,如果 64 位进程将 APC 排队到 32 位进程,或者反之亦然,则地址将不正确,并且应用程序会崩溃。 其他因素可以防止成功执行函数,即使地址已知也是如此。
每个线程都有自己的 APC 队列。 APC 的队列是线程调用 APC 函数的请求。 操作系统发出软件中断,以指示线程调用 APC 函数。
将用户模式 APC 排入队列后,线程不会被引导至调用 APC 函数,除非此函数处于可警告状态。 线程处于可警报状态后,线程先处理所有挂起的 APC,先 (FIFO) 顺序,等待操作 返回WAIT_IO_COMPLETION。 线程使用 SleepEx 函数、 SignalObjectAndWait 函数、 WaitForSingleObjectEx 函数、 WaitForMultipleObjectsEx 函数或 MsgWaitForMultipleObjectsEx 函数进入可警报状态。
如果应用程序在线程开始运行之前排队 APC,则线程首先调用 APC 函数。 线程调用 APC 函数后,它会为其 APC 队列中的所有 APC 调用 APC 函数。
可以睡眠或等待 APC 中的对象。 如果在 APC 中执行可警报等待,它将以递归方式调度 APC。 这可能会导致堆栈溢出。
当线程使用 ExitThread 函数 或 TerminateThread 函数 终止时,其 APC 队列中的 APC 将丢失。 不调用 APC 函数。
当线程正在终止的过程中,调用 QueueUserAPC 以添加到线程的 APC 队列将失败, (31) ERROR_GEN_FAILURE。
请注意, ReadFileEx 函数、 SetWaitableTimer 函数和 WriteFileEx 函数 函数是使用 APC 作为完成通知回调机制实现的。
若要编译使用此函数的应用程序,请将 _WIN32_WINNT定义为0x0400 或更高版本。 有关详细信息,请参阅 使用 Windows 标头。
要求
最低受支持的客户端 | Windows XP [桌面应用|UWP 应用] |
最低受支持的服务器 | Windows Server 2003 [桌面应用|UWP 应用] |
目标平台 | Windows |
标头 | processthreadsapi.h (包括 Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2) |
Library | Kernel32.lib |
DLL | Kernel32.dll |