2013-05-25 3 views
2

Я помню, что был способ сделать это, что-то похожее на сигналы unix, но не так широко используется. Но не помню этот термин. Нет событий/мьютексов: поток просто прерывается в случайном месте, функция вызывается, и когда она возвращается, поток продолжается.Как вызвать функцию в контексте другого потока?

+0

Вы уверены, что это была функция в контексте другого потока? Windows упрощает запуск кода в другом процессе, но в другом потоке это то, чего я никогда не помню. – JimR

+0

Пожалуйста, не помещайте информацию о теге в свой заголовок. Система маркировки здесь очень хороша в классификации вещей и не нуждается в помощи. :-) Пожалуйста, см. [Если вопросы включают «теги» в их названиях?] (Http://meta.stackexchange.com/q/19190/172661). Благодарю. –

ответ

1

вы можете найти RtlRemoteCall, но это недокументированная процедура. есть APC в Windows, семантически подобный сигналу Unix, однако APC требует, чтобы целевой поток находился в аварийном состоянии для доставки, не гарантируется, что это условие всегда выполняется.

+0

Просто попробовал RtlRemoteCall. По-видимому, если поток находится в небезопасном ожидании (синхронный ReadFile), функция не вызывается. – basin

2

Windows имеет Asynchronous Procedure Calls, который может вызывать функцию в контексте конкретной нить. APC не просто прерывают поток в случайном месте (что было бы опасно - поток мог быть посреди записи в файл или получения блокировки или в режиме ядра). Вместо этого APC будет отправляться, когда вызывающий поток переходит в переменное ожидание, вызывая определенную функцию (см. Документацию APC).

Если причина того, что вам нужно вызвать код в определенной теме, потому что вы взаимодействуете с пользовательским интерфейсом, было бы прямо на send или post сообщения окна в оконной ручку, которую вы хотите обновить. Сообщения окна всегда обрабатываются в потоке, который создал окно.

+0

+1, yup - PostMessage/SendMessage для GUI, иначе APC с предупреждающим ожиданием. –

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