Я новичок в MFC и делаю простую программу, которая будет постоянно обновлять два поля редактирования. В полях редактирования содержатся координаты x и y курсора мыши. Программа начинает захватывать координаты курсора только при нажатии кнопки запуска, и она должна останавливаться при нажатии кнопки остановки. Но как только я нажимаю кнопку пуска, все окно зависает.
Вот что у меня так далеко:
//Way up high in the code:
#include <windows.h>
//way down low in the code
void CmfcpixelDlg::OnBnClickedButtonStart()
{
POINT p;
CString x;
CString y;
int px;
int py;
while(stop == false){
GetCursorPos(&p);
px = p.x;
//convert x coordinate to a CString
x.Format(L"%d", px);
//convert y coordinate to a CString
py = p.y;
y.Format(L"%d", py);
m_x.SetWindowTextW(x.GetBuffer());
m_y.SetWindowTextW(y.GetBuffer());}
}
Вы блокируете цикл событий. Вы не можете сделать цикл, который требует вмешательства пользователя, чтобы закончить в потоке GUI — вы должны сделать это в отдельном потоке.
На самом деле, вы не должны выполнять любой длительные операции в основном потоке.
По сути, тот же поток, который выполняет ваш цикл, является потоком, который отвечает за отображение и обновление графического интерфейса. Поскольку этот поток сейчас ожидает обновления графического интерфейса для выхода из цикла а также этот поток является тем же потоком, который должен обновлять графический интерфейс, у вас Catch-22 или, по словам программиста, тупик.
Чтобы решить эту проблему, вы можете разбить свой код на новый поток или, что еще лучше, спроектировать его так, чтобы полностью исключить цикл. Ваш код довольно прост, и это можно сделать без цикла:
Вы должны использовать OnMouseMove
событие и обновлять поля редактирования, только если пользователь нажал кнопку «Пуск».