DLL Synchronize () зависает без ошибок и вылетает

Я построил модульную программу, состоящую из нескольких программ (exe), и в некоторых случаях эти модули также находятся в DLL. Есть около 6 модулей.

Все эти модули использовали функции потока. Этот поток не использует визуальные компоненты, он в основном анализирует огромные файлы (> 1 ГБ).

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

Ранее потоки работали нормально, без изменения кода, кроме случаев, когда это необходимо для адаптации их к проекту DLL.

Теперь, когда я запускаю процедуры Thread, все работает нормально, кроме метода synchronize (), который останавливается без ошибок или блокирует основную программу.

Метод synchronize () используется потому, что потоки создаются полностью внутри DLL. Поэтому основная программа называется процедурной DLL, которая создает и запускает поток без какого-либо вмешательства со стороны основной программы.

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

Я искал в Google, но не нашел информации, за исключением того, что кто-то сказал, что, возможно, метод synchronize () ожидает основного процесса, который не отвечает по неизвестным причинам.

Примечание: основная программа и окно не блокируются и не зависают; только поток, который не вызывает / не запускает процедуру, предусмотренную для synchronize (); Я подтвердил это!

добавленной

Примечание 2: Я хочу избежать такого же использования PostMessage () или аналогичного, потому что оно заставляет меня включать LCL, который увеличивает размер файла DLL с текущих 300 КБ до 2 МБ (в режиме выпуска). Кроме того, есть сообщения, что его работа не так хороша, как ожидалось.

1 ответ

Это потому, что у вас есть два полных экземпляра всего (RTL,LCL и т. Д.). Один набор в DLL, другой набор в EXE. И код и данные.

Вы, вероятно, вызываете синхронизацию DLL, которая планирует это для цикла LCL в DLL, которая ничего не делает, так как вся работа выполняется в EXE.

Это будет очень трудно исправить, в основном вам нужны пакеты для этого. Частично также потому, что участие потоков еще больше усложнит его из-за переменных потоков (локальное хранилище потоков), которые могут быть по-разному настроены для потоков DLL и EXE.

Для этого нужны пакеты, которые находятся только на начальных этапах и решают это, имея только одну копию всего. Смотрите ссылку для более глубокого трактата.

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