как создать функцию блокировки - PullRequest
0 голосов
/ 17 августа 2010

У меня есть поток, которому нужно отправить сообщение (имитируемое событие мыши, которое оно отправляет с использованием SendInput), как только оно сгенерировано.Я хочу, чтобы это происходило в цикле, когда нет сна;добавление любого сна снижает производительность, так как я хочу, чтобы события сразу попадали в цикл обработки событий после их генерации.Конечно, я также не хочу, чтобы цикл в потребительском потоке загружал все процессоры, поэтому я не могу просто продолжать его запуск, хотя это дает мне хорошую производительность.

Насколько я понимаю,задача состоит в том, чтобы заставить потребляющий поток ждать чего-то, что сигнализирует о том, что производящий поток предоставил что-то для отправки (?), но как лучше всего это сделать?Я думаю, что мне нужно что-то вроде двух мьютексов, если я хочу сделать два потока взаимоисключающими;потребитель ждет производителя, а производитель продолжает работу, как только потребитель возобновит работу?До сих пор это не получалось, и я действительно не знаю, как лучше всего это сделать;CriticalSections против мьютексов, что-то совершенно другое?

Причина, по которой я не хочу вызывать SendInput из потока производителя, заключается в том, что этот поток («основной поток»?) Фактически выполняется в ответ на сообщение о перемещении мыши, перехваченный ловушкой мыши и отправка большего количества сообщений мыши из этого потока, не позволила потоку завершить работу до того, как было обработано событие перемещения имитированной мыши, что мешало мне.Как я и подозревал, перемещение вызова SendInput в другой поток, чтобы исходный поток мог завершить работу, устранило проблему, но теперь мне нужно сделать потребителя более отзывчивым;Сообщения от мыши продолжают поступать в хорошем темпе, я полагаю, так как всего лишь 1 мс сна сделал цикл слишком медленным, а обработка сообщений стала отставать;все хорошо работает, если я не сплю.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 17 августа 2010

Звучит так, будто вы хотите использовать объекты событий win32 вместо мьютексов или критических секций.Смотри документы здесь .Функции событий позволяют потоку ожидать условие, которое может быть передано другим потоком.

1 голос
/ 18 августа 2010

Потоки Windows поддерживают очереди сообщений - обычно используются для сообщений Windows, но полностью пригодны для обмена сообщениями между рабочими потоками. PostThreadMessage можно использовать в Hook Proc для отправки сообщений в другой поток для обработки.

Рабочий поток может сделать обычный цикл GetMessage для извлечения сообщений для обработки - вместо передачи их на DispatchMessage, как если бы в потоке пользовательского интерфейса вы просто проверяли, что HWND равен NULL в структуре сообщения, указывая его сообщение, затем обработайте сообщение самостоятельно. В случае потенциального затопления сообщений PeekMessage может использоваться для отбраковки любых ожидающих сообщений из очереди.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...