2008-11-11 2 views

ответ

15

Не делайте этого. Это достаточно схематично, когда вы используете приложение, управляющее циклом событий; перекачка сообщений из DLL просто добавляет к риску, что вы в конечном итоге получите код, наивный программист не стал безопасным для повторного входа.

+0

Я совершенно согласен. – 2008-11-12 08:19:58

+0

Я согласен с тем, что DoEvents не используется. Но что, если DoEvents, которые вызывают проблемы, поступает из сторонней DLL, для которой у вас нет источника? У меня был кошмар проблемы с перерисованием в моем приложении, и я подозреваю его, потому что элемент управления вызывает DoEvents, и мои основные петли приложений заканчиваются суррогатом этого элемента управления, поэтому всякий раз, когда элемент управления не отображается, все мое приложение перестает правильно перерисовываться. – 2009-05-21 01:42:21

3

Возможно, вы имели в виду System.Windows.Forms.Application.DoEvents()?

0

Напишите интерфейс для EXE и укажите его основную форму или основной класс. Затем зарегистрируйте этот объект, реализующий интерфейс с DLL. Назначьте его переменной типа интерфейса Сделайте подпрограмму, которая видна во всей DLL. В подпрограмме проверьте, не является ли переменная ничем, если она не является подпрограммой, которая запускает метод, который вы создали для запуска DoEvents. В любое время, когда вам нужно сделать DoEvents, вызовите подпрограмму.

Если вы используете трехуровневую организацию для своего приложения, поместите подпрограмму или переменную на объект, представляющий все ваше приложение. Регистрируйте форму с объектом Application.

Если у вас есть проблемы с повторным подключением, вы можете добавить переменную статуса и другие вспомогательные функции, чтобы безопасно проверять, что делает приложение. Обратите внимание, что гораздо легче реализовать это, если вы используете какой-то тип многоуровневого дизайна.

Другим аспектам этого повторного входа является проблема, однако это не отвечает требованиям пользовательского интерфейса. В сложном приложении есть обстоятельства, при которых вы должны пропускать цикл событий.

2

Я бы выбрал «не делать» (из DLL или проекта пользовательского интерфейса). Есть несколько вещей, которые вы можете сделать, чтобы сделать код библиотеки хорошо совместимым с пользовательским интерфейсом, включая те же тонкие трюки (с событиями и/или обратными вызовами), которые вы можете использовать из пользовательского интерфейса. Самый простой подход заключается в том, что код библиотеки просто выполняет «как есть», и если пользовательский интерфейс возникает, чтобы создать его в рабочем потоке, то это задача UI обрабатывать любые события и маршалировать их (Control.Invoke/BeginInvoke) в поток пользовательского интерфейса для Обновления пользовательского интерфейса.

Для более сложных сценариев, вы можете использовать для синхронизации контекста (SynchronizationContext.Current), чтобы отправлять сообщения в потоке пользовательского интерфейса (это на самом деле, как Control.Invoke и т.д. работа, но реализация не зависит - так WPF синхронизации контекст может пройти диспетчер WPF).

Можете ли вы добавить больше контекста о том, что такое сценарий? Есть много вещей, которые можно сделать ...