2017-03-28 7 views
0

でLengthyOperationを取り消すことができます。は、どのように私は、MSDNの記事を読む、完全に混乱がありますのWindowProc

HWND hwnd; 
BOOL fDone; 
MSG msg; 

// Begin the operation and continue until it is complete 
// or until the user clicks the mouse or presses a key. 

fDone = FALSE; 
while (!fDone) 
{ 
fDone = DoLengthyOperation(); // application-defined function 



while (PeekMessage(&msg, hwnd, 0, 0, PM_REMOVE)) 
{ 
    switch(msg.message) 
    { 
     case WM_LBUTTONDOWN: 
     case WM_RBUTTONDOWN: 
     case WM_KEYDOWN: 
      // 
      // Perform any required cleanup. 
      // 
      fDone = TRUE; 
    } 
} 
} 

MSDNは、このコードの私たちは、長い操作中にメッセージキューを調べる &をした場合に、それを取り消すことができます言いますマウスクリックまたはキーボードのキーダウン。 どうすればいいですか?

DoLengthyOperationが開始されてから終了するまでPeekMessageはこの時間に呼び出しを行わず、操作をキャンセルできません。

MSDNのリンク:https://msdn.microsoft.com/en-us/library/windows/desktop/ms644928

+0

この関数は、しばらくの間、* false *を返し、長い操作がまだ行われていないことを示します。鍵は、1つの長い操作を多数の小さな操作に分割することです。 –

+0

* GUI *スレッドでDoLengthyOperation();を呼び出さないでください - 別の作業スレッドで呼び出す必要があります。あなたのコード例で 'DoLengthyOperation();'が実行されるまで - 'PeekMessage'を呼び出さず、ウィンドウメッセージが全くなく、あなたのUIはフリーズします – RbMm

+0

@HansPassant次の呼び出しで、以前の呼び出しで実行されたコードの最後の行から?次のコール関数で再び最初の行から実行 –

答えて

0

あなたが求めているものを行うには、あなたがDoLengthyOperation()自体の内部からメッセージキューをのぞき見する必要があり、例えば:

BOOL fDone = FALSE; 
do 
{ 
    fDone = DoLengthyOperation(); 
} 
while (!fDone); 

... 

BOOL DoLengthyOperation() 
{ 
    MSG msg; 

    ... 

    if (PeekMessage(&msg, hwnd, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE) || 
     PeekMessage(&msg, hwnd, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
     return TRUE; 
    } 

    ... 

    if (PeekMessage(&msg, hwnd, WM_MOUSEFIRST, WM_MOUSELAST, PM_REMOVE) || 
     PeekMessage(&msg, hwnd, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE)) 
    { 
     TranslateMessage(&msg); 
     DispatchMessage(&msg); 
     return TRUE; 
    } 

    ... 

    return FALSE; 
} 

そうしないと、長時間の操作を移動する必要があります別のワーカースレッドに代わって、メインのUIメッセージキューをまったくブロックしないでください。メインメッセージループがマウス/キーボード入力を正常に受け取ると、スレッドが実行中であればそれを終了するように通知することができます。

関連する問題