Тот факт, что объект Twain требует дескриптор окна в своем конструкторе объектов, предполагает, что что-то внутри объекта Twain требует обработки сообщений. Обработка сообщений между потоками сложна для начала, но тем более, когда это происходит внутри API.
Если twain API создает дескриптор окна (открыто, например, всплывающее окно или диалоговое окно, или тайно, например, для межпроцессного взаимодействия (IPC)) как часть одной из функций API, вызываемых из фонового потока этот дескриптор окна будет связан с тем потоком, в котором он был создан - фоновым потоком. Все сообщения, отправленные этому дескриптору окна, будут стоять в очереди в ожидании фонового потока для их обработки в цикле сообщений. У вас нет цикла сообщений в фоновом потоке, поэтому дескриптор окна застрянет в подвешенном состоянии. Он не будет отвечать на сообщения окна. Отправленные сообщения останутся без ответа. SendMessage () заблокируется.
Даже если это не проблема дескриптора окна / цикла сообщений, весьма вероятно, что если API Twain не был явно и преднамеренно реализован с учетом многопоточности, у него будут проблемы при использовании в потоках. Вы создаете объект twain в одном потоке, а затем используете его в другом потоке, так что это ситуация с несколькими потоками. Если бы вы могли создать объект twain в фоновом потоке и использовать объект twain только в контексте этого фонового потока, это может обойти проблемы схождения потоков в реализации API twain. Когда используются дескрипторы окон и сообщения, перемещение всего в фоновый поток также может ухудшить ситуацию.
Возможность использовать объект между потоками не предоставляется бесплатно. Если twain API не был разработан для использования в потоках, вы мало что можете сделать, чтобы он работал в потоках. Лучше всего держать объект Twain в главном потоке пользовательского интерфейса.