ptLibert 发表于 2013-12-29 17:50:48

选股公式包含DLL时出错的解决方法

如果某个DLL用在单个图上时正常,用在选股时却导致出错甚至崩溃,很有可能是因为DLL使用了某些全局变量或资源。而选股是多线程的,可能会造成资源使用冲突。

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

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



bluechina 发表于 2013-12-29 18:35:06

备档留查~~~

nttz 发表于 2013-12-31 12:04:31

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

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

ptLibert 发表于 2013-12-31 14:00:50

nttz 发表于 2013-12-31 12:04 static/image/common/back.gif
如何锁定范围缩小,比如一个全局序列来由一个函数保存返回的值,另一个函数来读取他,同时能保证读写都是同 ...

怎么个不行

nttz 发表于 2013-12-31 15:52:54

ptLibert 发表于 2013-12-31 14:00 static/image/common/back.gif
怎么个不行

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

fantasynew 发表于 2013-12-31 20:22:02

nttz 发表于 2013-12-31 12:04 static/image/common/back.gif
如何锁定范围缩小,比如一个全局序列来由一个函数保存返回的值,另一个函数来读取他,同时能保证读写都是同 ...

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

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

zyh5724 发表于 2014-1-5 04:53:55

学习学习

gf66wj88 发表于 2014-10-10 20:09:46

学习了

abc123226 发表于 2017-4-6 17:21:37

ptLibert 您好:

我的FoxFunc.dll中有如下2个函数JiZhu和JiJu,分别输出0和1的信号,在单个图上正常,在如下的选股公式中会出错崩溃

A:= "FoxFunc@JiZhu";
B:= "FoxFunc@JiJu";

A=1 && B=1;

同样的dll和选股公式在交易师环境下还没有碰到崩溃情况。

根据您的介绍,我在FoxFunc.cpp中加入以下语句:
CRITICAL_SECTION g_criticalSection;
并将DLLMain改成您的新的语句,
然后加入了函数void WINAPI Enter()和void WINAPI Leave();FoxFunc.h没有做任何变化。

编译dll后将选股公式改成下面语句:
extern 'General.dll' void Enter();
extern 'General.dll' void Leave();

Enter();
A:="FoxFunc@JiZhu";
B:="FoxFunc@JiJu";
A=1 && B=1;
Leave();

公式的编译可以通过,但是有如下提示:
提示 行:0 列:0 条件选股公式有多于一个输出, 判断时只取第一个

同时公式没有能够选出任何股票,而在交易师环境下的没有改过的选股公式可以选出股票。

请教,我的理解是否错误,应该在哪里修改?另外,是否有现成的案例可以参考?

谢谢!

abc123226 发表于 2017-4-6 17:25:37

对不起,上面输错部分文字,选股公式改成如下:

extern 'FoxFunc.dll' void Enter();
extern 'FoxFunc.dll' void Leave();

Enter();
A:="FoxFunc@JiZhu";
B:="FoxFunc@JiJu";
A=1 && B=1;
Leave();
页: [1]
查看完整版本: 选股公式包含DLL时出错的解决方法