Я работаю над написанием DLL-оболочки-оболочки для сопряжения коммуникационной DLL для измерителя мощности yokogawa WT1600 с пакетом автоматизации на базе ПК. Я получил коммуникационную часть для работы, но мне нужно нарезать ее так, чтобы можно было сохранить время сканирования пакета автоматизации 50 мс. (Вызов расширенного функционального блока (EFB) блокирует сканирование до его возврата)
Вот шаги, которые мне нужно сделать.
- Звоните EFB
- EFB создает поток для настройки соединения (для этого требуется около 200 мс)
- EFB возвращает EFB_BUSY, пока поток выполняет работу
- 3a. (программа автоматизации продолжает сканирование, пока не вернется к вызову EFB)
- Вызовите EFB, передав, что он вернулся занятым при последнем вызове
- EFB проверяет, вернулся ли поток
- Если поток вернулся, то EFB вернет успех, иначе вернет EFB_BUSY
- повторять 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: Создание потоков в качестве моей модели.