DoEvents в DLL

У вас есть идеи, как вызвать DoEvents из C# DLL?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
4 092
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

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

Anthony Brien 21.05.2009 05:42

@Anthony, именно поэтому вы не должны использовать его в DLL, особенно не в DLL, которую вы без исходного кода будете передавать кому-то другому. К сожалению, если вы не можете полностью отказаться от библиотеки, вы, вероятно, застряли, пытаясь понять, как написать свое приложение на основе эгоистичного поведения этой сторонней DLL ... я вам сочувствую!

Shog9 21.05.2009 06:02

Можете ли вы дать альтернативу: while(true) { if (something) break; Application.DoEvents(); //or your solution }

chouaib 24.12.2013 09:28

Да, chouaib: while(true) { if (something) break; } //don't call this from a UI thread

Shog9 24.12.2013 09:31

Вы имеете в виду System.Windows.Forms.Application.DoEvents()?

Я согласен. Как и любой другой инструмент, бывают случаи, когда это хорошая идея, а иногда - плохая. Однако это решать разработчику, не так ли?

configurator 12.11.2008 15:06

@configurator: если разработчику принадлежит код обработки сообщений для потока, то да. Если разработчик пишет DLL, загруженную и вызываемую потоком, которым он не владеет, то нет.

Shog9 12.11.2008 17:33

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

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

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

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

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

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

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

Другие вопросы по теме