У меня есть объект A, который должен быть уведомлен (метод A :: Notify()), когда какой-то поток запускается или замирает.
Допустим, эта ветка динамически загружает мой DLL-файл (я могу его написать).
Я считаю, что я должен написать функцию dllMain этой DLL, однако я не уверен, как получить ссылку на объект A из этой функции, поэтому я могу запустить ее метод Notify().
любые идеи?уведомлять объект при запуске потока
ответ
Можно ли сделать A::Notify()
статическим методом? В противном случае метод Singleton
может служить цели.
Итак, если я понимаю, что вы пишете, в вашей основной программе у вас есть экземпляр класса A. Когда ваша основная программа загружает определенные DLL, вы хотите, чтобы она вызывала A :: Notify для этого экземпляра?
Насколько я знаю, нет способа передать дополнительный аргумент LoadLibrary.
Если A :: Notify может быть либо статическим, либо A является одноэлементным, экспортируйте метод «NotifyA» из exe, затем вызовите DLL LoadLibrary («yourexe»), и вы получите GetProcAddress, чтобы получить адрес NotifyA который вы можете вызвать. (Да EXE файлы могут экспортировать методы как библиотеки DLL!)
Второго варианта написать свой собственный LoadLibrary, что называют второй метод после длл магистрали, например
HMODULE MyLoadLibrary(string dll, A *a)
{
HMODULE module = LoadLibrary(dll.c_str())
void (call*)(A*) = void (*)(A*)GetProcAddress(module, "Init");
call(a);
return module;
}
Библиотеки DLL Init метод может затем хранить Экземпляр для последующего.
Я думаю, что объект A отсутствует в DLL, нет? – neuro
DLL загружается один раз в каждый процесс. После загрузки его DllMain автоматически вызывается всякий раз, когда поток создается в процессе. Предполагая, что А глобальная переменная, вы можете сделать следующее:
- После первой загрузки DLL, вызовите экспортируемую функцию, которая будет устанавливать глобальный указатель А в DLL
- Всякий раз, когда DllMain вызывается с причина, связанная с потоком, вызовите A через указатель, который у вас есть в DLL.
Другим вариантом является запуск цикла сообщений в вашем exe и передача его идентификатора потока в DLL. Затем, всякий раз, когда поток присоединяется к DLL, отправляйте сообщение в цикл с сообщением о деталях созданного потока. Это немного более сложное решение, но это избавит вас от необходимости использовать DLL, знакомый с классом A.
- 1. Уведомлять родителя о завершении потока
- 2. Что делает Handler при запуске потока?
- 3. Java: Уведомлять ожидание() - Инж объект
- 4. Как изменить переменные при запуске потока
- 5. ошибка при запуске нового потока в андроида
- 6. Ошибка при запуске контекста потока Spark
- 7. Сбой приложения при запуске нового потока
- 8. реализовать Runnable Run() при запуске потока
- 9. .NET WPF MissingMethodException при запуске нового потока
- 10. «Python SyntaxError: недействительный синтаксис» при запуске потока
- 11. CancelledError: RunManyGraphs при запуске распределенного тензорного потока
- 12. Spring Integration - запуск потока при запуске приложения
- 13. Задержка основной нити при запуске другого потока
- 14. Java, главный код останавливается при запуске потока
- 15. Уведомлять TObjectList при изменении объекта
- 16. Мгновенный объект при запуске Tomcat
- 17. Как сделать два потока ждать и уведомлять друг друга
- 18. Нежелательный вызов деструктора при запуске потока в функции-члене
- 19. Уведомлять при изменении содержимого файла
- 20. Уведомлять сервер при удалении cookie
- 21. Уведомлять темы при изменении счетчика
- 22. ASP.NET проверяет статус потока на длинном запуске потока?
- 23. Какой объект был нажат при запуске события?
- 24. Entity Framework заполняет объект при запуске
- 25. Ошибка при запуске randomForest: объект не найден
- 26. Неизвестный объект при запуске теста junit
- 27. Уведомлять ListBox и элемент ListBox для CRUD из фонового потока
- 28. Android: Gcm получает повесили из-за потока Уведомлять и ждать
- 29. Уведомлять от внутренней flatMap
- 30. Два потока, один объект
Точнее. кажется, что вы читаете свой вопрос о том, что часть «уведомлять» не зависит от загрузки dll. Если это так, вам просто нужно, чтобы ваш класс потоков вызывал A :: notify() (вы даете ему ссылку на A: DIP), затем загружайте свою DLL. – neuro