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