2017-01-15 4 views
0

WndProcのタイマープロシージャー機能に関する質問があります。 Timerによって呼び出された後にDisplay_functionがまだ終了していない場合、次のTM_TIMER関数が呼び出されてもDisplay_functionが実行されているとどうなりますか?WinApi WndProcのタイマープロシージャーの問題

LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage, WPARAM wParam, LPARAM lParam) 
{ 
HDC hdc; 
PAINTSTRUCT ps; 
static HANDLE hTimer; 
switch (iMessage) 
{ 
case WM_COMMAND: 
switch (LOWORD(wParam)) 
{ 
case 0: 

hTimer = (HANDLE)SetTimer(hWnd, 1, 10, NULL); //10ms 
SendMessage(hWnd, WM_TIMER, 1, 0); 
break; 

.... 
case WM_TIMER: 
switch (wParam) 
{ 
case 1: 
Display_function(hWnd); 
break; 
} 
+0

誰も[SetTimer](https://msdn.microsoft.com/en-us/library/windows/desktop/ms644906.aspx)を間違った方法で使用しているようです。 * nIDEvent *パラメーターは、理由のためにポインター・サイズです。一意のIDを持つポインタを設定する安全な方法は、(ローカル)変数のアドレスを渡すことです。そうすれば、IDは他のタイマーIDと決して衝突しません。 – IInspectable

答えて

2

メッセージキューからメッセージを取得すると、タイマーメッセージが合成されます。タスクからスレッドを中断することはできません。

通常、タイマーメッセージは、メインメッセージループからのGetMessageへの呼び出しによって合成されます。

+0

ありがとうしかし、私はそれを正確に取得していない、それはあなたが完了する前にDisplay_functionがタイマーによって中断できないことを意味します。私は正しい? –

+0

@ grander2 - もちろん、Display_functionは中断されません。 – RbMm

+0

正しい。 GetMessageを呼び出すのはあなたのコードです。 Display_functionにメッセージをディスパッチしない限り、リエントラントはありません。 –