Потоки в DLL, где DLL должна возвращаться до завершения дочернего потока - PullRequest
0 голосов
/ 09 марта 2009

Я работаю над написанием DLL-оболочки-оболочки для сопряжения коммуникационной DLL для измерителя мощности yokogawa WT1600 с пакетом автоматизации на базе ПК. Я получил коммуникационную часть для работы, но мне нужно нарезать ее так, чтобы можно было сохранить время сканирования пакета автоматизации 50 мс. (Вызов расширенного функционального блока (EFB) блокирует сканирование до его возврата)

Вот шаги, которые мне нужно сделать.

  1. Звоните EFB
  2. EFB создает поток для настройки соединения (для этого требуется около 200 мс)
  3. EFB возвращает EFB_BUSY, пока поток выполняет работу
    • 3a. (программа автоматизации продолжает сканирование, пока не вернется к вызову EFB)
  4. Вызовите EFB, передав, что он вернулся занятым при последнем вызове
  5. EFB проверяет, вернулся ли поток
  6. Если поток вернулся, то EFB вернет успех, иначе вернет EFB_BUSY
  7. повторять 3a-6, пока efb не вернет успех

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

РЕДАКТИРОВАТЬ # 1

        HeavyFunction::HeavyFunction^ hf;  //HeavyFunction is a class that has a time consuming function in it
        ThreadStart^ efbThreadDelegate;
        Thread^ efbThread;

        if( pEfbData->nBlockingRecall != DOEFB_BUSY ) {
            hf  = gcnew HeavyFunction::HeavyFunction;
            hf->iiStart = (int)(pEfbData->uParams[0].dw);
            hf->iiEnd = (int)(pEfbData->uParams[1].dw);
            efbThreadDelegate = gcnew ThreadStart( hf, &HeavyFunction::HeavyFunction::iGetPrime );
            efbThread = gcnew Thread( efbThreadDelegate );
            efbThread->Start();
            return DOEFB_BUSY;
        }else if ( efbThread->IsAlive ) {
            return DOEFB_BUSY;
        }else {
            uRetValue->dw = hf->iReturn;
            return 0;
        }

Будет ли efbThread иметь тот же дескриптор потока при последующем вызове?

РЕДАКТИРОВАТЬ # 2

Я заставил его работать, создав глобальную РУЧКУ для Mutex и потока. Инициализация мьютекса в точке входа init (выполняется при загрузке dll) и создание потока в основной функции, когда фактически выполняется вызов dll.

Я использовал пример кода из MSDN: Создание потоков в качестве моей модели.

1 Ответ

1 голос
/ 09 марта 2009

Любой созданный поток (будь то в DLL или где-либо еще) не остановится самопроизвольно. В частности, функция, которая создала поток, может вернуться. Новый поток все равно будет работать, даже если создатель завершит работу. То есть, если он не достиг конца своей функции входа.

Потоки Windows возвращают DWORD, когда готовы. Чтобы посмотреть, вызовите WaitForSingleObject для дескриптора потока с тайм-аутом в 0 секунд, а в случае успеха вызовите GetExitCodeThread.

Я не понимаю всю вашу вещь "EFB", ни то, что она, ни то, что она делает, хотя. Если он делает забавные вещи с обычными потоками Windows, все ставки отключены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...