Модальная операция с использованием IMessageFilter и DoEvents - PullRequest
1 голос
/ 07 января 2009

Это приложение Windows Forms. У меня есть функция, которая фиксирует некоторые события мыши модально, пока не будет выполнено условие. Например, я хотел бы подождать, пока пользователь выберет точку в клиентской области окна (или при желании отменить операцию с помощью клавиши Escape), прежде чем функция вернется. Я использую следующую структуру:

Application::AddMessageFilter(someFilter);
while(someFilter->HasUserSelectedAPoint_Or_HitEscapeKey()){
    Application::DoEvents();
}
Application::RemoveMessageFilter(someFilter);

Это работает довольно хорошо, за исключением того, что занимает почти 100% использование процессора, когда управление входит в цикл while. Я ищу альтернативу, аналогичную показанной ниже:

Application::AddMessageFilter(someFilter);
while(someFilter->HasUserSelectedAPoint_Or_HitEscapeKey()){
    // Assuming that ManagedGetMessage() below is a blocking
    // call which yields control to the OS
    if(ManagedGetMessage())
        Application::DoEvents();
}
Application::RemoveMessageFilter(someFilter);

Как правильно использовать IMessageFilter и DoEvents? Как передать управление ОС до получения сообщения? Любой GetMessage эквивалент в управляемом мире?

1 Ответ

1 голос
/ 07 января 2009

Вы можете спать в потоке 500 мс или около того между DoEvents() вызовами. Поэкспериментируйте с разными значениями, чтобы увидеть, что кажется правильным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...