gpt4 book ai didi

c++ - 如何在不卡住窗口的情况下在 MFC 中连续运行函数?

转载 作者:行者123 更新时间:2023-11-27 23:19:25 24 4
gpt4 key购买 nike

我是 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 线程中结束的循环 - 您需要在单独的线程中执行。

事实上,您不应该在主线程中执行任何冗长的操作。

基本上,运行循环的线程就是负责显示和更新 GUI 的线程。因为此线程现在正在等待 GUI 更新以退出循环并且此线程与应该更新 GUI 的线程相同,所以您遇到了 Catch-22,或者用程序员的话来说,就是死锁。

要解决此问题,您可以将代码拆分到一个新线程中,或者更好的是,将其设计为完全消除循环。您的代码相当简单,并且可以无循环地完成:

  • 点击开始:设置标志。
  • 在鼠标移动时:更新 x、y 坐标文本如果设置了标志。没有循环!
  • 点击停止:取消设置标志。

关于c++ - 如何在不卡住窗口的情况下在 MFC 中连续运行函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14362339/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com