C++ Interruptbehandlung beim Mausrad

Magogan

Lieutenant
Registriert
Aug. 2013
Beiträge
606
Hi,

ich habe ein kleines Problem. Mein Code funktioniert soweit, allerdings werden die Interrupts sehr langsam behandelt, wenn ich also sehr schnell und lange scrolle und irgendwann wieder die Scroll-Richtung ändere, dauert es ewig (mehrere Sekunden), bis in die andere Richtung gescrollt wird. Ich habe leider keine Ahnung, ob und wie ich das Problem beheben könnte. Weiß das von euch jemand?

Code:
LRESULT CALLBACK WndProc(HWND hwnd, UINT umessage, WPARAM wparam, LPARAM lparam)
{
	switch(umessage)
	{
		// Check if the window is being destroyed.
		case WM_DESTROY:
		{
			PostQuitMessage(0);
			return 0;
		}

		// Check if the window is being closed.
		case WM_CLOSE:
		{
			PostQuitMessage(0);		
			return 0;
		}

		

		// All other messages pass to the message handler in the system class.
		default:
		{
			return ApplicationHandle->MessageHandler(hwnd, umessage, wparam, lparam);
		}
	}
}

Code:
LRESULT CALLBACK SystemClass::MessageHandler(HWND hwnd, UINT umsg, WPARAM wparam, LPARAM lparam)
{
	if(umsg == WM_MOUSEWHEEL)
		{
			//MessageBox(m_hwnd, L"Mouse wheel", L"Test", MB_OK);
			

			short x = (short)HIWORD(wparam);
			m_Application->HandleInterrupt(MOUSEWHEEL_ROTATED,x);
 
		}
	return DefWindowProc(hwnd, umsg, wparam, lparam);
}

Code:
void ApplicationClass::HandleInterrupt(int buttonID, int param1){
	//WaitForSingleObject(InterruptMutex,INFINITE);
	if(buttonID==MOUSEWHEEL_ROTATED){
		if(param1<0){
			targetCameraDistance+=0.5f;
			if(targetCameraDistance>=m_settings->maxCameraDistance){
			targetCameraDistance=m_settings->maxCameraDistance;
			}
		}
		if(param1>0){
			targetCameraDistance-=0.5f;
			if(targetCameraDistance<=0){
			targetCameraDistance=0;
			}
		}
	}
	//ReleaseMutex(InterruptMutex);
}
Noch eine Frage: Brauche ich den Mutex bei Interrupts?
 
Das liegt daran, dass deine Behandlungsroutine länger braucht als die Zeit zwischen 2 Mausradevents. Entsprechend baut sich eine Warteliste mit Mausradmeldungen auf die zuerst abgearbeitet werden müssen bevor die Nachricht mit der neuen Richtung drankommt.

Die Lösung liegt darin, vor jeder Behandlungsroutine alle ausstehenden Mausradevents z.B. mit PeekMessage(...) auszulesen und nur den letzten zu verwenden.


In
if(umsg == WM_MOUSEWHEEL)

liest du alle anstehenden (falls vorhanden) Mousewheel Nachrichten :

MSG msg;
while(PeekMessage(&msg, 0, WM_MOUSEWHEEL, WM_MOUSEWHEEL, PM_REMOVE)) {
wparam = msg.wParam;
}

short x = (short)HIWORD(wparam);
 
Zuletzt bearbeitet:

Ähnliche Themen

Antworten
2
Aufrufe
1.417
Antworten
5
Aufrufe
2.659
R
Antworten
3
Aufrufe
1.528
Zurück
Oben