evilC / IOWrapper

Universal Control Remapper 2.0 (Back End)

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Interception - Poll loop could be improved?

evilC opened this issue · comments

Current poll loop is like:

private void PollThread(bool blockingEnabled)
{
	_pollThreadRunning = true;

	var stroke = new ManagedWrapper.Stroke();

	while (!pollThreadStopRequested)
	{
		for (var i = 1; i < 11; i++)
		{
			// Process Keyboards
		}
		for (var i = 11; i < 21; i++)
		{
			// Process Mice
		}
	}
}

This seems inefficient - for example, if there is only 1 keyboard plugged in, it does 9 pointless iterations of a loop.
Looking at the Interception API, it seems that ManagedWrapper.Wait(_deviceContext) will gice the ID of the next device that has input waiting to process.

Therefore, something like this may be more efficient?

private void PollThread(bool blockingEnabled)
{
	_pollThreadRunning = true;
	
	var stroke = new ManagedWrapper.Stroke();

	while (!pollThreadStopRequested){
		var deviceId = ManagedWrapper.Wait(_deviceContext);
		ConcurrentDictionary<int, IDeviceHandler<ManagedWrapper.Stroke>> monitorArray;
		var isKeyboard = ManagedWrapper.IsKeyboard(deviceId);
		var monitorArray = isKeyboard ? _monitoredKeyboards : _monitoredMice
		var isMonitored = monitorArray.ContainsKey(deviceId);
		
		while (ManagedWrapper.Receive(_deviceContext, deviceId, ref stroke, 1) > 0))
		{
			var block = false;
			if (isMonitored){
				if (isKeyboard)
				{
					block = _monitoredKeyboards[deviceId].ProcessUpdate(stroke);
				}
				else
				{
					block = _monitoredMice[deviceId].ProcessUpdate(stroke);
				}
			}
			if (!(blockingEnabled && block))
			{
				ManagedWrapper.Send(_deviceContext, deviceId, ref stroke, 1);
			}				
		}
		Thread.Sleep(1);
	}
	_pollThreadRunning = false;
}

No, cannot be improved