2012-04-27 4 views
0

У меня возникли трудности с использованием функции API QueueUserAPC. В принципе, я создал новый поток, который просто петли, используя WaitForSingleObject на объекте Event, который я создал. Я хотел, чтобы это нить вроде бы «одинокий» рабочий поток, что я могу назначить случайные вызовы функций, что мне нужно обрабатывается асинхронно ..QueueUserAPC не работает, если не используется сразу после создания потока?

Однако, когда я создаю нить, единственный раз, когда QueueUserAPC будет работать в напрямую после создания потока. Если я вставлю, скажите, Sleep(2000); сразу после CreateThread, тогда поместите QueueUserAPC после сна, он не выполнит эту функцию, даже если она работает, если я сделаю это до Sleep (сразу).

Я пробовал использовать другой дескриптор потока, я попытался сбросить объект события, проверил возвращенное значение QueueUserAPC, когда он не работает (он равен 1, который MSDN говорит, что ненулевой результат успешный операция).

Я не совсем знаю, что с этим делать. Любые предложения будут ценны.

Спасибо!

J.R.

ответ

2

Использование WaitForSingleObjectEx(). Если не используется одно из ожидающих вызовов ожидания «Ex», APC не будет выгружен и запущен потоком. Если wait возвращает WAIT_IO_COMPLETION - APC был выполнен потоком. Как правило, какой-то цикл используется для игнорирования этого завершения:

while(WAIT_IO_COMPLETION==WaitForSingleObjectEx(waithandle, INFINITE,true)); 
// do signalled stuff 
+0

Большое спасибо, что оно работает. Я не понимал, что использовал неправильный вызов ожидания. – Joseph

+0

Кроме того, MSDN: «Если приложение ставит APC перед запуском потока, поток начинается с вызова функции APC», поэтому объясняется «работа непосредственно после создания потока» :) –

+0

WFSOE имеет * три * аргументы. Последний, отсутствующий в фрагменте, является важным. –

Смежные вопросы