MT4 DLL ذاكرة التلوث - Page 2
الصفحة 2 من 589 FirstFirst 1234 ... الأخيرةالأخيرة
Results 11 to 20 of 41

Thread: MT4 DLL ذاكرة التلوث

  1. #11
    راجع للشغل: هل رأيت بالفعل موضوعي حول إنشاء dlls مع FPCLazarus؟
    https://www.forexdrop.com/general-fo...oning-egy.htmlينبغي أن أضيف فصلاً تم استنباطه للمتغيرات العالمية ، وكيفية تجنبها وكيفية استخدامها إذا لزم الأمر.

  2. #12
    كقاعدة سيتم إنشاء vars العمومية في DLL الخاص بك لحظة يتم تحميل DLL (الاستدعاء الأول إلى DLL). وتغيرت من قبل جميع الوصول. يتم تغيير المتغيرات المحلية في كل وظيفة عندما يتم استدعاء الدالة ويتم تخزين المؤشرات عليها في المكدس ، يتم الوصول إليها فقط عن طريق استدعاء الدالة التي تم إنشاؤها ، ويتم تدميرها عند الخروج من الوظيفة. المشكلة التي تواجهها هي مشكلة Multi Threading EG: - E1 و E2 هي 2 EAs كل منها يعمل في موضوع مختلف. D1 your DLL F1 your DLL function Inserted Code/Your DLL code/Global Var int x؛ باطل F1 () ؛ {int y؛/local var x = 1000؛ بينما (xgt؛ 0) {y = 2000؛ بينما (ygt؛ 0) {y--؛} x--؛ }} لذلك عندما يتم تشغيل ما يلي يمكن أن يحدث وسوف يحدث: يستدعي E1 F1 ، ويتم إنشاء var 'temp' جديد. ثم يتوقف عن العمل في منتصف الطريق خلال الوظيفة لأن نظام التشغيل يقول أن timeslice الخاص به قد ارتفع. كل شيء يعمل بشكل جيد. إذا لم تكن E2 موجودة فلن تكون هناك مشاكل على الإطلاق. يدعى E2 الآن F1 ويتم إنشاء ”temp” var Y جديد. F1 على الفور يضبط X إلى 1000 ... لقد قمت الآن بتفكيك استدعاء E1 إلى الدالة لأن المتغير الشامل قد تغير ، وعندما يحصل E1 على المعالج ، سيعثر على int x ليكون مختلفًا عن الوقت الذي توقفت فيه. بالطبع لن يعرف E1 أو يهتم بهذا. يمكنك حل هذه المشكلة بسهولة دون OOP ، عليك فقط أن تكون على دراية بأنك تقوم باستدعاء نفس الوظيفة (الوظائف) من سلاسل رسائل متعددة ، لذلك عليك أن تكون خيطًا آمنًا. إما باستخدام أو بدون OOP ، يجب أن يكون لديك طريقة لإضافة علامة X منفصلة لكل EA. ومن ثم ، فإن الحاجة إلى توفير وظيفة التهيئة لـ ”بنك” منفصل من المتغيرات العالمية لكل EA. في المثال أعلاه ، يمكن تحقيق ذلك بسهولة عن طريق جعل Int X مصفوفة ذات حجم مناسب ، وتوفير وظائف initdeinit لإضفاء عنصر البعد الصفيف على كل متصل فريد لوظيفة init. E.G. E1 int myID = DLLinit ('GBPJPY')؛/تُرجع 1 F1 (myID)؛/الآن يمكن لـ F1 استخدام MyID للإشارة إلى X var الصحيح في الصفيف العام. E2 int myID = DLLinit ('EURUSD')؛/returns 1 OOP غالبًا ما تكون طريقة أكثر أناقةً لتوزيع هذه المشكلة ، ولكنها لن تعمل إلا إذا فهمت المشكلة ثم قمت برمجتها بشكل صحيح. مع OOP سوف تبحث لإنشاء كائن جديد (واحد لكل EA) عند استدعاء دالة init DLL. لن يعمل هذا إلا إذا قمت بتغليف مجموعة منفصلة من المتغيرات ”العامة” داخل كل كائن جديد.

  3. #13
    7bit: لقد قمت بتغيير الكود بحيث لا يكون هذان المتغيران العامان ، لم أكن حتى لاحظتهما حتى ألصقت الشفرة ، وكذلك تأكيدك على أنها لا تزال مستمرة بين المكالمات التي تجعل من المنطقي لماذا كان يفعل ما كان عليه . سوف أعلمك كيف يمكنني الحصول على الاختبار التجريبي لها. سوف ألقي نظرة على مقالتكم الآن ، ربما قرأتها ، تقرأ الكثير هذه الأيام! شكرا مرة آخرى

  4. #14
    Rangebound: شكرا لمشاركتك ، أستطيع أن أرى المشكلة التي أخطأت هي أنني أفترض أن كل حمولة من EA ستقوم بتحميل نسخة منفصلة من DLL ، مفصولة بشكل جيد عن المكالمات الأخرى التي قد تكون مستمرة. أتفق تماما مع المثال الخاص بك. ما يكفي من المعرفة أن هذا قد أعطاني حلاً لمشكلة أخرى كان لدي ، كانت الإجابة طوال الوقت. شكرا لمساعدتك

  5. #15
    وأود أيضا أن أقول شكرا لك! إلى 7bit و rangebound لمساعدتهم هنا. ات هاز. أنا أستخدم دلفي 2009 (Object Pascal) لكتابة DLLs الخاصة بي. باستخدام النصيحة في هذا الموضوع وأيضا هذا واحد ، لقد أزلت جميع الأعطال عن طريق نقل جميع المتغيرات العالمية لفئة وتمرير مؤشر إلى الكائن بين MT4 و DLL. هذا حل أي تصادم الذاكرة. ومع ذلك ، يبدو أنه لا يزال هناك شيء لست أفهمه. لتجنب ALL crashing ، كنت بحاجة إلى استخدام TCriticalSection لضمان أن مخطط واحد فقط تم الوصول إلى DLL في كل مرة. على سبيل المثال: Inserted Code/Delphi (Object Pascal) DLL Code: var csTick: TCriticalSection؛ وظيفة DLLGet: منطقية. ابدأ csTick.Enter؛ النتيجة: = True؛ النهاية؛ الإجراء DLLFree. تبدأ csTick.Leave. النهاية؛ التهيئة csTick: = TCriticalSection.Create؛ finalization csTick.Free ، Inserted Code/EA Code: #import MyLogic.dll bool DLLGet ()؛ باطل DLLFree ()؛ #import init init () {DLLGet ()؛ int iPointer = DLLGetNewObject (الرمز ()) ؛ ... تهيئة أخرى ... DLLFree ()؛ عودة (0)؛ } int start () {static int iPrevOrderCount = 0؛ DLLGet ()؛ ... استدعاءات دالة DLL متعددة ... DLLFree ()؛ عودة (0)؛ } مرة أخرى ، لا يوجد لديك vars عالمية في DLL؛ يتم التفاف كل شيء (باستثناء كائن TCriticalSection) في الفئة ثم يتم تمرير مرجع الفئة إلى DLL مع كل استدعاء دالة. ولكن ما زلت أحصل على نوع من الاصطدامالفساد لأنني بحاجة إلى استخدام مؤشر ترابط الصفحات (TCriticalSection) لجعله يعمل بشكل صحيح. هنا هو السبب في أنني أحضر كل هذا. لا تزال هناك مشكلة واحدة بسيطة: إذا تم استدعاء deinit () للحصول على مخطط ، فستتوقف MT4 عن وظيفة start () على الفور ، وهو ما يعني في بعض الأحيان لا يتم استدعاء DLLFree () ويتم قفل جميع المخططات الأخرى من DLL. إذن ، باختصار سؤالي هو: لماذا أحتاج إلى استخدام إشارة TCriticalSection؟ إذا كان كل شيء في الصف ، ما هي الاصطدامات الأخرى التي يمكن أن تكون هناك؟ شكرا لكم!

  6. #16
    خطأي
    . لقد وجدت var العالمية في وحدة المدرجة. أزلت ذلك var وكل شيء على ما يرام الآن - دون الحاجة إلى أشباه! مرة أخرى، شكرا لكم على مساعدتكم.

  7. #17
    يجب أن لا تحتاج إلى استخدام الأقسام الهامة لمعظم ملفات DLL ، وهذا يشير إلى بعض مسائل الترميز الأساسية الأخرى ، والتي قد تكون واحدة من العديد من الأشياء. أفضل ما يمكن القيام به هو .... قص التعليمات البرمجية من DLL الخاص بك حتى لديك DLL الأساسية التي لا تزال تحطم. ثم انشر المصدر هنا وسألقي نظرة. مع الأخذ في الاعتبار أنك لا تذكر حالة حدوث تحطم ... إذا كنت لا ترغب في السير في هذا الطريق ، فإن أفضل تخميناتي هي: 1) إذا كان EA الخاص بك يقوم بعملية تحديدتهيئة ، فقد تحاول DLL إنشاء كائن ثانٍ نفس زوج العملة. هل قمت بترميز فخ لوقف الإزدواجية. لا تفترض مضمون DLL الخاص بك للحصول على مكالمة DeInit. يجب عليك التحقق من وجود ازدواجية في عمليات تهيئة العملة نفسها. 2) هل تقوم DLL بتخزين المؤشرات وإدارتها لتدمير هذه الكائنات؟

  8. #18
    شكرا لك Rangebound! كل شيء يعمل بشكل جيد الآن ، بدون أي أعطال أو تسرب للذاكرة ، ولكن مشاركتك تثير بعض الأسئلة:
    Quote Originally Posted by ;
    1) إذا كان EA الخاص بك يقوم بـ deinitInit فقد تحاول DLL الخاص بك إنشاء كائن ثانٍ لنفس زوج العملة. هل قمت بترميز فخ لوقف الإزدواجية. لا تفترض مضمون DLL الخاص بك للحصول على مكالمة DeInit. يجب عليك التحقق من وجود ازدواجية لبدايات العملة نفسها.
    الطريقة التي كتبت بها ، إذا لم يتم استدعاء deinit () ، لن يتم تحرير الكائن. ولكن بغض النظر عن تسرب الذاكرة التي لا ينبغي أن تتسبب في تحطمها لأن الكائن الثاني سيكون له ذاكرة جديدة ، صحيح؟
    Quote Originally Posted by ;
    2) هل تقوم DLL بتخزين المؤشرات وإدارتها لتدمير هذه الكائنات؟
    عادةً يمكنني استخدام TThreadList (قائمة حظر مؤشرات الترابط من المؤشرات) في DLL للقيام بشيء مثل هذا - هل هناك طريقة أخرى؟ بمعنى آخر ، كيف يجب تخزين المؤشرات في DLL دون استخدام var عالمي أو بعض آلية حظر؟ هذا مفيد جدا - شكرا لإسهامكم.

  9. #19

  10. #20

    Quote Originally Posted by ;
    لا تخزن المؤشرات في DLL على الإطلاق. ضعهم في أعداد صحيحة 32 بت ، قم بتخزينهم في EA ، وعلاجهم مثل مقابض الموارد من نوع ما ، وتمررهم كمعلمات لوظائف المجمّع في dll (الذي سوف يلقيهم مرة أخرى ، يُفصح عنهم ثم يستدعي الأسلوب الفعلي من مثيل الكائن). أفعل هذا في بيثون ملزمة. جميع كائنات Python الموجودة في python26.dll هي مؤشرات فعلية ولكن يمكنني التعامل معها بسهولة مثل الأعداد الصحيحة التي سيتم استخدامها بواسطة رمز mql. كل المهام بي بيثون بيبي المجمع التي تحتاج إلى مؤشر لبيثون ...
    نعم ، هذا بالضبط ما أفعله ، لكن RangeBound أثارت قلقا بشأن الكائن لا يحصل على تحرير لأنه قد لا يتم استدعاء DeInit () ، واقترح أن أقوم بتخزين قائمة من المؤشرات في DLL حتى تتمكن من إدارة الذاكرة.

أذونات النشر

  • لا تستطيع إضافة مواضيع جديدة
  • لا تستطيع الرد على المواضيع
  • لا تستطيع إرفاق ملفات
  • لا تستطيع تعديل مشاركاتك
  •  
  • رمز BB مفعل
  • الابتسامات مفعلة
  • رمز[IMG] مفعل
  • رمز [VIDEO] مفعل
  • رمز HTML غير مفعل
This website uses cookies
We use cookies to store session information to facilitate remembering your login information, to allow you to save website preferences, to personalise content and ads, to provide social media features and to analyse our traffic. We also share information about your use of our site with our social media, advertising and analytics partners.