Я пишу библиотеку DLL в Delphi с несколькими созданными ею потоками. Позвольте мне описать проблему шаг за шагом. Прошу прощения за длинное описание заранее: - (.
Давайте на время забудем о библиотеке. Я создал приложение для Windows, которое будет представлять виды с нескольких камер. Я создал окно, которое предназначено для отображения вида с одной камеры и содержит элемент управления TImage. Существует поток (потомок TThread), который загружает текущее изображение с камеры каждые пару миллисекунд и назначает его элементу управления TImage этого окна (используя метод Synchronize ()). Приложение создает несколько экземпляров этого окна при запуске (с отдельным потоком для каждого из них), поэтому вы можете видеть в режиме реального времени несколько камер одновременно. Более того, все эти окна просмотра объединены главным окном приложения, поэтому они появляются внутри него.
Все работало нормально, пока я не решил поместить эти два окна в библиотеку dll. Я просто нашел это необходимым по некоторым причинам, но они не важны сейчас. Поэтому я создал новую библиотеку dll, добавил в проект существующее главное окно и окно просмотра камеры и экспортировал функцию, которая создает и возвращает экземпляр главного окна. Когда главное окно создано, оно создает несколько окон просмотра камеры, делая себя их родителем.
Затем для целей тестирования я создал приложение, которое импортирует вышеупомянутую функцию dll из библиотеки и вызывает ее при запуске, чтобы получить экземпляр главного окна; затем просто показывает его на экране (в немодальном состоянии).
Когда я запустил приложение, выяснилось, что я не мог получить ни одного изображения с любой камеры. Когда я его отладил, я заметил, что когда поток вызывает метод Synchronize (), он зависает навсегда. Этого не произошло до того, как поместить оба этих окна в dll.
И это моя проблема. Честно говоря, это мой первый подход к библиотекам, с которым мне пришлось столкнуться во многих других проблемах. Вы можете задаться вопросом, почему я использую окна вместо фреймов ... Поэтому всякий раз, когда я создавал экземпляр TFrame в dll, я получал исключение, говорящее "у элемента управления xxx нет родительского окна". Я не знал, что с этим делать, поэтому вместо этого использовал windows: - (.
Подскажите, пожалуйста, что делать с проблемой синхронизации? Основной поток, похоже, не блокируется каким-либо образом при запуске приложения, поскольку он принимает нажатия кнопок и т. Д. В чем проблема?
Пожалуйста, помогите!
Заранее спасибо !!