Диалог MFC завис

Мне нужна помощь, как разморозить мое диалоговое окно. Я использую MFC, и у меня есть бесконечный цикл, который я хочу выполнить при нажатии кнопки. Однако диалоговое окно зависает при запуске бесконечного цикла. Теперь я просмотрел эту тему, где у кого-то была похожая проблема. .

К сожалению, я попробовал многопоточность, но обнаружил, что она не может работать для меня, потому что я использую API, который использует автоматизацию OLE, и я получаю необработанное исключение памяти. Я думаю, это потому, что программа использует последовательный порт, и я где-то читал, что вы можете использовать дескриптор последовательного порта только в одном потоке.

Моя программа заключается в том, чтобы просто посмотреть, не подключился ли кто-нибудь к моему модему, и дождаться, пока он отправит мне файл, а затем повесить трубку. Вот моя петля.

while(1)
    {
        //get rid of input buffer
        ts->_this->m_pHAScript->haReleaseRemoteInput();
        ts-> _this->textBox->SetWindowTextA("thread Commence");
        //wait for connected
        if(success = ts->_this->m_pHAScript->haWaitForString("CONNECT",timeout))
        {
            //getFile
            if(success = ts->_this->m_pHAScript->haWaitForXfer(5000))
            {
                //hangup
                ts->_this->haTypeText("+++ath\r");
            }
        }

    }

Есть ли способ разморозить диалоговое окно?


person Shabbir Hussain    schedule 16.05.2012    source источник
comment
Вы по-прежнему можете использовать многопоточность с автоматизацией OLE. Но вы должны вызывать OleInitialize() в начале каждого потока!   -  person Stefan    schedule 17.05.2012


Ответы (2)


Добавьте этот код внутрь цикла while:

MSG msg;
while(PeekMessage(&msg, GetSafeHwnd(), 0, 0, PM_REMOVE))
{
  DispatchMessage(&msg);
}
person David Brabant    schedule 16.05.2012
comment
И надеюсь, вы не столкнетесь с какими-либо неприятными ошибками повторного входа. - person asawyer; 16.05.2012
comment
Извините, но ваше решение не работает. Этот цикл приводит к разрыву моего цикла, а также моя программа не закрывается. Моя отладка остается открытой, и некоторые процессы, запускаемые программой, также остаются открытыми. - person Shabbir Hussain; 16.05.2012

Графический интерфейс в Windows основан на цикле обработки сообщений — где-то в вашем коде, явно или скрытом в фреймворке, есть цикл, который проверяет наличие сообщения в очереди и обрабатывает его. Если что-то блокирует возврат кода в этот цикл, графический интерфейс замораживается.

Есть несколько способов обойти это. Один из них был предоставлен Дэвидом Брабантом, по существу дублируя цикл. Другой способ — запустить новый «рабочий» поток, который независимо выполняет операцию блокировки. Если в вашем цикле сообщений есть функция, которую он вызывает, когда он простаивает, т. е. в очереди больше нет сообщений, вы можете выполнить там некоторую обработку; однако в вашем примере это невозможно.

person Mark Ransom    schedule 16.05.2012
comment
Проблема с решением Дэвида заключается в том, что хотя окно закрывается, когда я нажимаю кнопку закрытия, цикл не прерывается. Как я могу проверить сообщения, чтобы увидеть, была ли нажата кнопка закрытия - person Shabbir Hussain; 16.05.2012
comment
@Mozly, в цикле PeekMessage вы можете проверить, является ли сообщение WM_QUIT - если это так, вам следует выйти из внешнего цикла. Поскольку вы вызываете блокирующие функции haWaitForString и haWaitForXfer, я сомневаюсь, что его решение сработает для вас, потому что вы не будете выполнять цикл PeekMessage достаточно часто. - person Mark Ransom; 16.05.2012