错误、漏洞、问题 - 页 3079

 
该截图在市场上没有加载。从两个浏览器中试了一下。
 
Dmitry Fedoseev #:
市场不加载屏幕截图。从两个浏览器尝试。

我也是...

 

下午好,可能是什么问题?我使用 dll 写入 SQL 服务器(例子来自文章https://www.mql5.com/ru/articles/2895)。

如果我最多使用5个线程,数据就能正确写入。如果我使用更多的线程,就会出现错误 "未处理的异常0xE0434352"。

Интеграция эксперта на MQL и базы данных (SQL Server, .NET и C#)
Интеграция эксперта на MQL и базы данных (SQL Server, .NET и C#)
  • www.mql5.com
Статья описывает, как добавить в экспертов на MQL5 возможность работы с сервером баз данных Microsoft SQL Server. Используется импорт функций из DLL. Для создания DLL применяется платформа Microsoft .NET и язык C#. Используемые в статье методы с незначительными изменениями подходят и для экспертов, написанных на MQL4.
附加的文件:
SQL.mqh  19 kb
OHLC_1.mq5  5 kb
 
SEM #:

下午好,可能是什么问题?我使用 dll 写入 SQL 服务器(例子来自文章https://www.mql5.com/ru/articles/2895)。

如果我最多使用5个线程,数据就能正确写入。如果我使用更多的线程,就会出现 "未处理的异常0xE0434352 "的错误。

在接口DLL的所有函数中,我们应该使用try catch,捕获 "未处理的异常 "并将其写入日志。

捕捉所有的异常,并尝试所有的调用,这是一个好主意。甚至在MQL文档中也清楚地写着--DLL不应该抛出异常,而不是C++。

特别是在文章中,conn.Closenew SqlConnection 不属于 "异常捕捉",有可能抛出异常。

 
Dmitry Fedoseev #:
该截图在市场上没有加载。我用两个浏览器试了一下。
Yury Emeliyanov#:

我也是...

你试过简单地拖放图片吗?

关于交易、自动交易系统和策略测试的论坛

市场和数学

Alexey Viktorov, 2021.08.19 21:01

试着用简单的拖放方式在文本上插入图片。

我现在试图在隐藏的专家顾问中进行修改,并拖动了我看到的第一张图片。



 
Alexey Viktorov #:

你试过简单地拖放图片吗?


5张图片中只有一张被添加

 
Andrei Trukhanovich #:

mql字符串真的不喜欢字符串中的空字符,也不喜欢字面意义上的空字符,在函数中也是如此。

唯一正常的方法是将三个字符串转换为一个带终结零的数组。

也就是说,现在的这种行为是几年前故意 为之的。我不知道原因是什么。

到处都有敌人

 
Maxim Kuznetsov #:

在所有的接口DLL函数中,用try catch包住一切,捕捉 "未处理的异常 "并记录下来。

捕捉所有的异常,并将所有对pluses的调用包裹在try中,是一个好主意。甚至在MQL文档中也清楚地写着--DLL不应该抛出异常,而不是C++。

特别是conn.Closenew SqlConnection 没有抛出异常,有可能会抛出一个

谢谢!检查了一下,共享变量访问错误。作者也写到了这一点。

必须指出的是,该演示项目有一个非常重要的限制:它只允许在一个MetaTrader终端上运行一个使用DB的专家顾问。问题是,所有的EA都使用一个加载的DLL的实例。由于我们的类是静态的,它对所有运行中的专家顾问都是一样的。变量也将是常见的。如果你运行几个专家,他们都将使用同一个连接和一个命令对象。 如果几个专家试图同时访问这些对象,可能会出现问题。


问:如何实现对dll的多线程访问(每个函数调用都有独立的实例,每个调用都有本地变量)?

 
2020.08.17 01:22:44   9842:0.8953065>0.92137
2020.08.17 01:22:44   9843:0.8953065>0.92106
2020.08.17 01:22:44   9844:0.8953065>0.92075
2020.08.17 01:22:44   9845:0.8953065>0.92045
2020.08.17 01:22:44   9846:0.8953065>0.92014
2020.08.17 01:22:44   9847:0.8953065>0.91983
        

2020.08.17 01:22:48   9842:0.8953065>0.92137
2020.08.17 01:22:48   9843:0.8953065>0.92106
2020.08.17 01:22:48   9844:1.7189865>0.92075
2020.08.17 01:22:48   Create GlobalVariables for SELL 1.7189865>0.92075
2020.08.17 01:22:48   9845:0.8953065>0.92045
2020.08.17 01:22:48   9846:0.8953065>0.92014
2020.08.17 01:22:48   9847:0.8953065>0.91983

我在MT5测试器中遇到了这个问题。

与多种货币一起工作,数据偶尔会从另一种货币中调换出来。检查测试器。请纠正它。

第一个值是SymbolInfoDouble(symbol,SYMBOL_BID)。

2020.08.17 01:11:38   9877(EURGBP):0.8952471000000001>0.91079
2020.08.17 01:11:38   9878(EURGBP):0.8952471000000001>0.91048
2020.08.17 01:11:38   9879(EURGBP):0.8952471000000001>0.91017
2020.08.17 01:11:38   9880(EURGBP):1.7184123>0.90987
2020.08.17 01:11:38   Create GlobalVariables for SELL 1.7184123>0.90987
2020.08.17 01:11:38   9881(EURGBP):0.8952471000000001>0.90956
2020.08.17 01:11:38   9882(EURGBP):0.8952471000000001>0.90925
2020.08.17 01:11:38   9883(EURGBP):0.8952471000000001>0.90894
2020.08.17 01:11:38   9884(EURGBP):0.8952471000000001>0.90864

就像它不能接收价格一样SymbolInfoDouble(EURGBP,SYMBOL_BID);并从另一个正在工作的货币对中取值。有什么方法可以检查报价是否正确?

 
SEM #:

谢谢你!检查了一下,共享变量访问错误。作者也写到了这一点

应该注意的是,该演示项目有一个非常重要的限制:它只允许在一个MetaTrader终端上运行一个与DB合作的专家顾问。问题是,所有的EA都使用一个加载的DLL的实例。由于我们的类是静态的,它对所有运行中的专家顾问都是一样的。变量也将是常见的。如果你运行几个专家,他们都将使用同一个连接和一个命令对象。 如果几个专家试图同时访问这些对象,可能会出现问题。


问:如何实现对dll的多线程访问(每个函数调用都有独立的实例,每个调用都有本地变量)?

在.NET中几乎没有办法做到这一点。这个类被做成静态的,并不是因为文章的作者是邪恶的,而是因为尖锐的类就是这样被导入的。

我认为有两种方法:1)(编写时间长,工作速度快)用C++重写,不再碰.NET 2)(相当机械,但速度会下降,而且可能有副作用)深思熟虑地将调用包在关键部分,以避免两个线程同时访问。

如果sharping很重要,另一个选择是在DLL级别重写连接池控制,记住EA<->connection_id的映射,每个EA都与它的连接一起工作;
,我不能说.net - 是否有可能在一些MQL结构或标量中获取和存储sharp对象的引用,并来回传递它。也就是像普通的C++指针一样操作。如果有可能,那么一切都会简化。