Как сделать непрерывно работающие функции в MFC, которые не замораживают окно?

Я новичок в 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());}
}

0

Решение

Вы блокируете цикл событий. Вы не можете сделать цикл, который требует вмешательства пользователя, чтобы закончить в потоке GUI — вы должны сделать это в отдельном потоке.

На самом деле, вы не должны выполнять любой длительные операции в основном потоке.

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

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

  • По щелчку запуска: установите флаг.
  • При перемещении мыши: обновить текст координат X, Y если флаг установлен. Никаких петель!
  • При нажатии кнопки «Стоп» снимите флажок.
4

Другие решения

Вы должны использовать OnMouseMove событие и обновлять поля редактирования, только если пользователь нажал кнопку «Пуск».

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector