欢迎您光临博庭社区!

 找回密码
 立即注册
查看: 3266|回复: 9

选股公式包含DLL时出错的解决方法 [复制链接]

Rank: 8Rank: 8

发表于 2013-12-29 17:50:48 |显示全部楼层
如果某个DLL用在单个图上时正常,用在选股时却导致出错甚至崩溃,很有可能是因为DLL使用了某些全局变量或资源。而选股是多线程的,可能会造成资源使用冲突。

这种情况可以通过简单的线程同步控制来避免冲突:
首先,在DLL中声明一个全局临界区
  1. CRITICAL_SECTION g_criticalSection;
复制代码


在DLLMain中初始化和删除它:
  1. BOOL APIENTRY DllMain(HANDLE hModule,
  2.                                           DWORD  ul_reason_for_call,
  3.                                           LPVOID lpReserved)
  4. {
  5.         switch( ul_reason_for_call ) {
  6.         case DLL_PROCESS_ATTACH:
  7.                 InitializeCriticalSection(&g_criticalSection);
  8.                 break;
  9.         case DLL_PROCESS_DETACH:
  10.                 DeleteCriticalSection(&g_criticalSection);
  11.                 break;
  12.         }
  13.         return TRUE;
  14. }
复制代码
并且定义两个函数,Enter和Leave,进入和离开临界区:
  1. void WINAPI Enter()
  2. {
  3.         EnterCriticalSection(&g_criticalSection);
  4. }
  5. void WINAPI Leave()
  6. {
  7.         LeaveCriticalSection(&g_criticalSection);
  8. }
复制代码
最后,在公式中,声明这两个函数
  1. extern 'FoxFunc.dll' void Enter();
  2. extern 'FoxFunc.dll' void Leave();
复制代码
如果是逐行公式,在开头处调用Enter,在结束调用Leave即可;
如果是逐根公式,在开头处判断当前K线序号,如果是第一根则Enter:
  1. if( BarPos==1) then
  2.         Enter();
复制代码
如果是最后一根则离开
  1. if( BarPos=DataCount)  then
  2.         Leave();
复制代码



使用道具 举报

Rank: 6Rank: 6

发表于 2013-12-29 18:35:06 |显示全部楼层
备档留查~~~

使用道具 举报

Rank: 6Rank: 6

激情奖

发表于 2013-12-31 12:04:31 |显示全部楼层
如何锁定范围缩小,比如一个全局序列来由一个函数保存返回的值,另一个函数来读取他,同时能保证读写都是同一股票计算结果,能否在函数内部处理呢
fun()
{
  ......
....
enter
  写全局 。。。。

}
fun2()
{
  读全局。。。
leave()
}
以前这样做似乎不行啊

使用道具 举报

Rank: 8Rank: 8

发表于 2013-12-31 14:00:50 |显示全部楼层
nttz 发表于 2013-12-31 12:04
如何锁定范围缩小,比如一个全局序列来由一个函数保存返回的值,另一个函数来读取他,同时能保证读写都是同 ...

怎么个不行

使用道具 举报

Rank: 6Rank: 6

激情奖

发表于 2013-12-31 15:52:54 |显示全部楼层
ptLibert 发表于 2013-12-31 14:00
怎么个不行

很久之前试过,试图在读写之间的代码最小,但是后来运行时这个脚本中两个相邻函数还是要死锁

使用道具 举报

Rank: 6Rank: 6

发表于 2013-12-31 20:22:02 |显示全部楼层
nttz 发表于 2013-12-31 12:04
如何锁定范围缩小,比如一个全局序列来由一个函数保存返回的值,另一个函数来读取他,同时能保证读写都是同 ...

为何要用全局序列呢?
全局序列的开销更大,即使不再使用也要占用内存。
你说的死锁会不会是这个原因?

还有不懂你想实现什么功能。如果是两个函数交换参数,临时定义一个序列就可以实现了

使用道具 举报

Rank: 6Rank: 6

发表于 2014-1-5 04:53:55 |显示全部楼层
学习学习

使用道具 举报

Rank: 2

发表于 2014-10-10 20:09:46 |显示全部楼层
学习了

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

bottom

Archiver|http://www.patiosoft.com

GMT+8, 2017-12-11 12:31 , Processed in 0.053593 second(s), 10 queries .

花生网 Copyrigh©2012

和讯信息科技有限公司 ALL Rights Reserved 版权所有 复制必究

回顶部