«Интерактивный» сон в C ++ - PullRequest
1 голос
/ 04 июля 2011

Я начал изучать c ++ некоторое время назад.Я сделал много консольных программ для Visual Studio 2010, и теперь я хочу создавать программы для win32.Я прочитал много уроков, и теперь я понимаю основы.

Я сделал кнопку, которая вызывает другую функцию.Функция отлично работает все работает.Но в этой функции есть Sleep (x), и GUI не отвечает, пока Sleep не заканчивается.Функция выполняется за 60 секунд, потому что в ней много сна, но она делает все, что нужно, просто GUI не отвечает на этот раз.

Мне кажется, я знаю источник этой проблемы.На мой взгляд проблема в том, что Sleep полностью приостанавливает работу приложения (Windows говорит: не отвечает).

Как сделать сон / паузу, которая не останавливает графический интерфейс?Есть ли функция, или я должен сделать это совершенно по-другому?

Заранее спасибо!

Ответы [ 4 ]

4 голосов
/ 04 июля 2011

На мой взгляд, проблема в том, что сон полностью приостановил приложение

Да.

Как сделать сон / паузу, которая не замерзаетграфический интерфейс?

Почему вам нужно спать в первую очередь?Если функция работает неправильно, вы всегда можете запустить ее в фоновом потоке (но учтите, что это добавляет немного сложности и сложности).Обычно вам вообще не нужно спать.Если вам действительно нужно спать, сделайте его циклом, который вращается до тех пор, пока не пройдет достаточно времени, обрабатывая события из ОС и вызывая Sleep(0), что приводит к увеличению временного интервала.

1 голос
/ 04 июля 2011

Можете ли вы разбить свой код на разделы и использовать таймеры вместо сна?Это будет поддерживать работу насоса сообщений.Посмотрите на эту статью в MSDN по использованию таймеров: http://msdn.microsoft.com/en-us/library/ms644901%28v=VS.85%29.aspx

0 голосов
/ 04 июля 2011

Вы должны использовать темы.Помните, что если у вас есть длительный процесс в вашем графическом интерфейсе, вы должны создать поток и позволить ему обрабатывать весь ваш код, который в этом случае содержит много неактивных инструкций.Когда поток завершит свою работу, он уведомит вас, и вы сможете извлечь из него данные.

0 голосов
/ 04 июля 2011

Либо перенесите работу в отдельный поток (см. CreateThread), либо используйте PeekMessage et. Я в тесном цикле, чтобы обрабатывать сообщения окна и поддерживать графический интерфейс.

Конечно, вы должны спросить себя, действительно ли вам нужно спать. Как вы сказали, спящий режим в главном потоке (потоке, который опрашивает насос сообщений) предотвращает любую обработку графического интерфейса.

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