2013-03-08 7 views
1

Чтение комментариев another question, я вижу, что существует риск столкнуться с условиями гонки при использовании метода Windows API GetWindowThreadProcessId. Насколько велика вероятность этого?GetWindowThreadProcessId Состояние гонки Риск

Позвольте мне указать, в чем я пытаюсь. Я пишу приложение для хронометража на C# для личного использования. Мое намерение состояло в том, чтобы обнаружить приложение (через вызовы Win API), когда активное окно было изменено, чтобы я мог регистрировать время против используемого приложения. Я уже установил код, который определяет, когда изменяется активное окно; теперь я пытаюсь определить процесс, связанный с этим окном. Я нашел несколько сообщений на SO, которые указывают на GetWindowThreadProcessId в качестве решения, но, как я уже упоминал, существует потенциальная проблема с его использованием. Если GetWindowThreadProcessId не является безопасным способом, то я открыт для других альтернатив.

Моя надежда состояла в том, чтобы сохранить код целиком на C#, но я не (полностью) против него, чтобы переместить его части в C/C++, если это необходимо.

Спасибо!

ответ

3

Гонка неизбежна. Нет API, который может атомизировать то, что вы хотите.

Но это довольно мягкая гонка. Что может пойти не так? Окно закрывается перед тем, как вы спросите об этом. Таким образом, вы получите сообщение об ошибке, а затем повторите попытку. Все, что вам нужно сделать, - это знать состояние гонки и корректно проверять и обрабатывать ошибки.

+0

Честно говоря, это то, о чем я думал. HWnd не изменяется, пока окно остается открытым, правильно? Если это так, то я думаю, что единственный раз, когда я должен беспокоиться об этом при закрытии окна. –

+1

Да, это так. Хорошо справляйтесь с ошибками, и это не проблема. Windows пытается избежать повторного использования дескрипторов. У вас не будет проблем. –

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