kbmMW使android App无法退出
升级到Delphi 11.1+kbmMW 5.19,编译后的项目在android平台上无法正常退出,这种情况下,再重进App,会卡死在启动界面,浪费N多脑细胞,发现是
kbmMWClientConnectionPool1造成的结果,他无法完成释放过程,跟踪代码发现执行StopScheduling方法时卡死,查看这个方法,原来就一句,执行线程对象的Pause方法,进一步查看Pause方法,发现调用逻辑使用FLock.BeginWrite进行加锁,而且嵌套使用的,类似下面的代码:
Flock.BeginWrite;
Flock.BeginWrite;
...
Flock.EndWrite;
Flock.EndWrite;
在执行Flock.BeginWrite卡死了!功力不够,所以先跳过Pause的执行,修改成下面这个,暂时避免这个问题:
procedure TkbmMWPooledDatasetRefreshScheduler.StopScheduling; begin if FThread.IsStarted then// add by 红鱼儿 FThread.Pause; end;
现在app可以正常退出了。已经将问题反应给作者,等修复。
具体地址在这里:https://components4developers.blog/forums/topic/aaaaa/#post-56413
进一步查看是TkbmMWMREWLock锁产生的这个问题,编译变量是默认的:
// =========================================================================== // Performance settings. // Remove the // from the following lines to enable specific performance // optimizations // =========================================================================== //{$DEFINE KBMMW_OPTIMIZED_MEMORYSTREAM} // If to use an optimized memory stream handling. //{$DEFINE KBMMW_SUPPORT_MRWSLOCK} // If to use Embarcadero Multiple Reader Exclusive Writer lock. {$DEFINE KBMMW_SUPPORT_FASTMRWSLOCK} // If to use native very fast Multiple Reader Exclusive Writer lock. {$DEFINE KBMMW_SUPPORT_FASTEVENT} // If to use native very fast event mechanism. {$DEFINE KBMMW_SUPPORT_LIGHTWEIGHTEVENT} // If to use Embarcadero lightweight event mechanism.
试着使用KBMMW_SUPPORT_MRWSLOCK编译项目,无法通过,因为源代码需要进一步修改,放弃测试。
kbmMW支持多种锁的,等作者处理吧。
开发环境:Delphi 10.4.2 Delphi 11.1及kbmMW 5.18,kbmMW 5.19都存在这个问题。