我正在尝试编写一个应用程序,以便通过以太网使用控制器区域网络设备,这样工程师就可以连接到物理连接到can总线的技术人员笔记本电脑。我想使用通用RP1210设备标准,因为大多数数据链路适配器都支持此标准。基本应用程序有客户端和服务器端。RP1210标准要求DLA制造商提供与硬件接口的动态链接库,并提供可通过使用LoadLibrary和GetProcAddress访问的公共RP1210函数。创建单线程应用程序工作得很好,但在操作中,应用程序需要是多线程的,因为在提供发送信号以刺激响应的同时,需要有一个阻塞的读取调用。
出现问题的地方是我无法从第二个线程获取任何可用的数据,第一个线程工作正常,但是第二个线程返回错误的值并崩溃。
我尝试在主线程中使用带有LoadLibrary和GetProcAddress的单个对象,并给出指向另一个线程的指针,这在第一个线程上有效,但在第二个线程上不起作用。我尝试调用LoadLibrary一次,并将句柄传递给踏板,然后从每个线程调用GetProcAddress。我还尝试从每个线程调用LoadLibrary和GetProcAddress,都不起作用,结果与上面相同。
我有一些问题:在一个线程中创建的dll函数指针应该在另一个线程中使用吗?
如果GetProcAddress返回的地址不能被另一个线程使用,则两个线程中的指针都具有非空值。
应用程序是使用QT5.9-3和Windows8.1上的MinGw编译器编写的C++。线程是使用从QTcpServer类实例化的QThread创建的。
函数指针的实例化方式如下:
typedef short (WINAPI *fxRP1210_ClientConnect)(HWND,short,char*,long,long,short);
fxRP1210_ClientConnect pRP1210_ClientConnect = NULL;
pRP1210_ClientConnect = (fxRP1210_ClientConnect)(GetProcAddress(m_dll_handle,"RP1210_ClientConnect"));
short DLLEXPORT WINAPI BUS_ClientConnect(HWND, short, char*, long send_buf, long recv_buf, short sftw);在cpp中
short Rp1210DllFunctions::BUS_ClientConnect(HWND win_handle, short client_id, char *protocol, long send_buf, long recv_buf, short sftw)
{
return pRP1210_ClientConnect( win_handle, client_id, protocol, send_buf, recv_buf,sftw );
}发布于 2017-12-31 05:19:49
否,GetProcAddress返回的指针对所有线程都有效。
然而,对象(句柄或其他对象)很可能只能从一个线程使用。
https://stackoverflow.com/questions/48037950
复制相似问题