Сценарий: У меня есть C++ DLL. В этой DLL я создал рабочий поток. В рабочем потоке у меня есть цикл, который ждет ввода пользователя через USB-устройство. Цикл заканчивается только тогда, когда пользовательский ввод на USB-устройстве соответствует некоторым критериям. Кроме того, мне нужно обращать внимание на обратную связь использования устройства USB в режиме реального времени для отображения на экране. Он использует интерфейс Delphi для обратной связи.Вызов функции обратного вызова главной темы из рабочего потока
Когда пользователь использует USB-устройство, функция обратного вызова будет выполнена системой Windows. Эта функция обратного вызова записывается в один файл C++ DLL и передается как параметр в функции инициализации устройства USB.
Я использовал глобальную переменную в DLL как флаг, чтобы определить, когда этот цикл должен выйти.
Я также загружаю эту C++ DLL из DLL Delphi. Delphi DLL -> C++ DLL Экран обратной связи из DLL Delphi.
В основном проблема, с которой я сталкиваюсь сейчас, заключается в том, что функция ptr, funcptr, вообще не может быть вызвана. На экране нет обратной связи в режиме реального времени. Это функция в Delphi DLL. Это строка кода:
(*(reinterprete_cast<FUNCPTR>(funcPtr)))("this is the feedback msg displayed on Delphi GUI");
ли кто-нибудь имеет решение для этого?
Я новичок и ценю любые ответы. Спасибо за помощь.
//Global variable
BOOL flag = TRUE;
//A function type in Delphi calling app
typedef void (__stdcall *FUNCPTR)(PCHAR);
//Functions start here.....
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
do {} while (flag);
}
function_1st_CalledFromDelphiDLL(FUNCPTR funcPtr)
{
Initialize_USBDevice(handleUSBDeviceEvent_callback, funcPtr);
}
function_2nd_CalledFromDelphiDLL()
{
DWORD threadID;
HANDLE hWorkerThread;
hWorkerThread = CreateThread(NULL,0,ThreadProc, 0, 0 , &threadID);
if (hWorkerThread!=NULL)
{
WaitForSingleObject(hWorkerThread, 30000);
}
}
//This is the callback function, called by Windows system when user meddles with the USB device
handleUSBDeviceEvent_callback(void *funcPtr)
{
flag = FALSE; //so loop in ThreadProc can exit
//The following code cannot be executed at all. Even when i Try MessageBox(NULL,L"msg",NULL,NULL), the message box doesn't popup too. But, I can write something to a filestream here.
(*(reinterprete_cast<FUNCPTR>(funcPtr)))("this is the feedback msg displayed on Delphi GUI");
}
Я добавил код. Пользовательский вход - устройство USB-датчика. – Robogal