Все, что я действительно хочу, это когда я получаю событие перемещения мыши, чтобы выплюнуть его из гнезда.
Из документации, на которую вы ссылались:
Потенциальная проблема с потоковой обработкой - блокировка. Поток, который записывает в ... поток, возможно, придется ждать бесконечно, пока в потоке не останется ... места для размещения байтов ...
Если вы просто сделали блокирующую запись, вы можете навсегда заблокировать приложение.
Если вы просто сделали неблокирующую запись, вы можете написать только часть того, что вы намеревались. Это запутает другую сторону, если вы не помните, что у вас осталось, и попытаетесь отправить его позже.
Введите цикл выполнения. События перемещения мыши также входят в цикл выполнения - вам не нужен или не нужен отдельный цикл выполнения. «Пересечение» двух источников событий - это как раз то, для чего предназначен цикл выполнения.
Вам понадобится симметрия между вашими обработчиками событий: каждый должен либо отправить несколько байтов, либо запомнить какое-то состояние (используя пару переменных экземпляра для последнего).
В обработчике перемещения мышью, если вы ранее получили событие с доступным пространством и не отправили событие перемещения мышью, отправьте только что полученное. В противном случае запомните событие на потом. (Держите только одно событие за раз - если вы получите другое, выбросьте старшее.)
Если в обработчике свободного места есть событие перемещения мыши, которое вы не отправили, отправьте его сейчас. В противном случае помните, что у вас есть свободное место, поэтому вы можете использовать его при следующем событии перемещения мыши.
В любом случае, когда вы пытаетесь записать байты и записать только некоторые из них, запомните байты и место, где вы остановились. Отправлять новое событие перемещения мыши следует только после полной отправки предыдущего.
Обратите внимание, что решение, как я его описал, будет отбрасывать события, если вы получаете события быстрее, чем вы можете отправить их. Это не проблема: если вы получаете их быстрее, чем вы можете отправить их, и вы держите их до тех пор, пока не сможете их отправить, то они либо накапливаются, либо опрокидываются (у вас заканчивается память и ваше приложение происходит сбой / ваше приложение перестает работать / вы перегружаете систему) или пользователь увидит случаи «догоняющего», когда мышь на приемном конце медленно воспроизводит все события по мере их поступления. Я говорю, что лучше в вашем В этом случае, чтобы отбросить события, которые вы не могли отправить, просто позвольте принимающей мыши телепортироваться через пространство, чтобы восполнить потерянное время.