EXE(带包 vcl;rtl) 调用 DLL(带包vcl;rtl;TestBpl, 其中TestBPL中使用TDiocpTcpClient), EXE不能正常退出的问题,可以通过在EXE动态加载 TestBPL解决
原以为是TestBPL有问题, 后面通过 EXE带上 TestBPl编译, 也能正常退出, 如果中间通过调用DLL时再装载BPL, 就会有问题
多次调试时,发现单元 diocp_core_engine.pas 以下代码
原以为是TestBPL有问题, 后面通过 EXE带上 TestBPl编译, 也能正常退出, 如果中间通过调用DLL时再装载BPL, 就会有问题
多次调试时,发现单元 diocp_core_engine.pas 以下代码
if CheckFlag(WORKER_RESERVED) then
begin
lvResultStatus := GetQueuedCompletionStatus(FIocpCore.FIOCPHandle,
lvBytesTransferred, lpCompletionKey,
POverlapped(lpOverlapped),
INFINITE);
end else
begin
// 临时工作线程, 30秒后没有任务可能会被释放
lvResultStatus := GetQueuedCompletionStatus(FIocpCore.FIOCPHandle,
lvBytesTransferred, lpCompletionKey,
POverlapped(lpOverlapped),
30000);
end;
begin
lvResultStatus := GetQueuedCompletionStatus(FIocpCore.FIOCPHandle,
lvBytesTransferred, lpCompletionKey,
POverlapped(lpOverlapped),
INFINITE);
end else
begin
// 临时工作线程, 30秒后没有任务可能会被释放
lvResultStatus := GetQueuedCompletionStatus(FIocpCore.FIOCPHandle,
lvBytesTransferred, lpCompletionKey,
POverlapped(lpOverlapped),
30000);
end;
EXE直接带TestBPL, 程序退出时, 我这边调试时, 会执行两次, 一次 lpOverlapped中有值, 第二次为 nil , 所以能够继续执行下面的代码处理后续流程
如果EXE加载DLL,再装载TestBPL, 调试时只执行了一次,此次 lpOverlapped中有值, 就再也不执行后续代码( 估计线程一直吊死了), 导致
FOnlineContextList.Count一直>0, 所以会卡住一段时间(WaitForContext(30000);), 也会造成 TIocpWorker中不能正常执行完毕, 引发其他问题
如果EXE加载DLL,再装载TestBPL, 调试时只执行了一次,此次 lpOverlapped中有值, 就再也不执行后续代码( 估计线程一直吊死了), 导致
FOnlineContextList.Count一直>0, 所以会卡住一段时间(WaitForContext(30000);), 也会造成 TIocpWorker中不能正常执行完毕, 引发其他问题