0

私はMFCを初めて使用し、2つの編集ボックスを継続的に更新する簡単なプログラムを作成しています。編集ボックスには、マウスカーソルの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());


}
}
4

2 に答える 2

4

イベントループをブロックしています。GUIスレッドで終了するためにユーザーの介入を必要とするループを実行することはできません。別のスレッドで実行する必要があります。

実際、メインスレッドで長い操作を実行するべきではありません

基本的に、ループを実行しているのと同じスレッドが、GUIの表示と更新を担当するスレッドです。このスレッドはGUIの更新がループを終了するのを待機しておりこのスレッドはGUIを更新することになっているスレッドと同じであるため、Catch-22、またはプログラマーの話ではデッドロックが発生します。

これを解決するには、コードを新しいスレッドに分割するか、ループを完全に排除するように設計することをお勧めします。コードはかなり単純で、これはループなしで実行できます。

  • 開始をクリックすると、フラグが設定されます。
  • マウス移動時:フラグが設定されている場合は、x、y座標テキストを更新します。ループはありません!
  • 停止をクリックすると、フラグの設定が解除されます。
于 2013-01-16T15:51:30.447 に答える
0

イベントを使用しOnMouseMove、ユーザーが[開始]をクリックした場合にのみ編集ボックスを更新する必要があります。

于 2013-01-16T15:53:27.657 に答える