- Сообщения
- 5,379
- Репутация
- 2,724
@inververs
Создайте глобальную переменную-счетчик. После прихода сообщения WM_COPYDATA функция-обработчик увеличивает счетчик сообщений на 1 и записывает данные сообщения куда-нибудь в очередь (если нужно). В основном цикле программы проверяется значение счетчика сообщений, и если оно не равно 0, то считывается (удаляется) сообщение из очереди и уменьшается значение счетчика на 1. Чтобы не заморачиваться с массивами, можно хранить сообщения в одной строке с разделителем, например, "|". Почему в строке? Потому что так намного проще и быстрее удалять из очереди первые сообщения. В случае массива пришлось бы передвигать все ячейки вверх после каждого удаления. Ну и естественно, удалять из очереди сообщения и изменять счетчик вне функции-обработчика нужно как можно быстрее. Вся обработка должна осуществляться уже после. Все это прекрасно работает в нескольких моих программах и библиотеках.
И еще один серьезный недостаток Dummy - отсутствие внутренней очереди и ограничение на передаваемые данные (вроде бы DWORD, но нужно проверить в справке). Таким образом, если вы собираетесь передавать бесконтрольные сообщения, то счетчик Dummy будет хранить все вызовы, а вот сами данные будут перезаписываться последним вызовом.
Если не хотите заморачиваться с организацией очереди (хотя, тут нет ничего сложного), то можно организовать передачу WM_COPYDATA с обратной связью, т.е. одна программа послала сообщение другой программе и ожидает от нее ответа для продолжения работы (следующего сообщения). Это избавляет от очереди и гарантирует обработку всех сообщений в реальном времени. Такой вариант хорошо подходит для визуализации прогресса работы другого процесса.
Вообщем, все зависит от конкретных задач.
Создайте глобальную переменную-счетчик. После прихода сообщения WM_COPYDATA функция-обработчик увеличивает счетчик сообщений на 1 и записывает данные сообщения куда-нибудь в очередь (если нужно). В основном цикле программы проверяется значение счетчика сообщений, и если оно не равно 0, то считывается (удаляется) сообщение из очереди и уменьшается значение счетчика на 1. Чтобы не заморачиваться с массивами, можно хранить сообщения в одной строке с разделителем, например, "|". Почему в строке? Потому что так намного проще и быстрее удалять из очереди первые сообщения. В случае массива пришлось бы передвигать все ячейки вверх после каждого удаления. Ну и естественно, удалять из очереди сообщения и изменять счетчик вне функции-обработчика нужно как можно быстрее. Вся обработка должна осуществляться уже после. Все это прекрасно работает в нескольких моих программах и библиотеках.
И еще один серьезный недостаток Dummy - отсутствие внутренней очереди и ограничение на передаваемые данные (вроде бы DWORD, но нужно проверить в справке). Таким образом, если вы собираетесь передавать бесконтрольные сообщения, то счетчик Dummy будет хранить все вызовы, а вот сами данные будут перезаписываться последним вызовом.
Если не хотите заморачиваться с организацией очереди (хотя, тут нет ничего сложного), то можно организовать передачу WM_COPYDATA с обратной связью, т.е. одна программа послала сообщение другой программе и ожидает от нее ответа для продолжения работы (следующего сообщения). Это избавляет от очереди и гарантирует обработку всех сообщений в реальном времени. Такой вариант хорошо подходит для визуализации прогресса работы другого процесса.
Вообщем, все зависит от конкретных задач.