এমটি 4 ডিএলএল মেমরি দূষণ - পৃষ্ঠা 2

Thread: এমটি 4 ডিএলএল মেমরি দূষণ

  1. #11
    বিটিডব্লিউসি: আপনি কি ইতিমধ্যে আমার থ্রেডটি FPCLazarus এর সাথে dlls তৈরি সম্পর্কে দেখেছেন?
    https://www.zapforex.com/general-for...oning-egy.htmlআমি গ্লোবাল ভেরিয়েবলের জন্য একটি অধ্যায় যোগ করা উচিত, কীভাবে এগুলি এড়িয়ে চলতে হবে এবং যদি সত্যিই প্রয়োজন হয় তবে কীভাবে তাদের ব্যবহার করা যায়।

  2. #12
    একটি নিয়ম হিসাবে আপনার DLL এর গ্লোবাল ওয়ারগুলি তৈরি করা হবে তাত্ক্ষণিকভাবে DLL লোড করা হবে (প্রথমে DLL এ কল করুন)। এবং সমস্ত এক্সেস দ্বারা পরিবর্তিত। ফাংশন বলা হয় এবং তাদের পয়েন্টার স্ট্যাকের উপর সংরক্ষণ করা হয় যখন প্রতিটি ফাংশন মধ্যে স্থানীয় ভেরিয়েবল alloed হয়, তারা শুধুমাত্র তাদের তৈরি ফাংশন কল দ্বারা অ্যাক্সেস করা হয়, এবং ফাংশন নির্গত যখন তারা ধ্বংস করা হয়। আপনার সমস্যা হচ্ছে একটি মাল্টি থ্রেডিং ইস্যু EG: - E1 এবং E2 প্রতিটি 2 টি ভিন্ন ভিন্ন থ্রেডে চলমান। D1 আপনার DLL F1 আপনার DLL ফাংশন সন্নিবেশ কোড/আপনার DLL কোড/গ্লোবাল ওয়ার int x; অকার্যকর F1 (); {ইন্ট Y;/স্থানীয় var x = 1000; যখন (xgt; 0) {y = 2000; যখন (ygt; 0) {y--;} x--; }} সুতরাং যখন এটি নিম্নোক্তভাবে চলবে এবং ঘটবে তখন হবে: E1 F1 কল করে এবং একটি নতুন 'temp' var Y তৈরি হয়। এটি তখন ফাংশনটির মাধ্যমে অর্ধেক চলমান বন্ধ করে দেয় কারণ ওএস বলেছে তার টাইমলাইসটি আপ। সবকিছু ভাল কাজ করছে। E2 অস্তিত্ব না থাকলে কোন সমস্যা হবে না। E2 এখন F1 এবং একটি নতুন 'temp' var Y তৈরি করে। F1 অবিলম্বে এক্স থেকে 1000 সেট করে ... আপনি এখন ফাংশনটিতে E1 এর কলটি ভাঙিয়েছেন কারণ গ্লোবাল ভেরিয়েবলটি পরিবর্তিত হয়েছে এবং E1 প্রসেসরটি ফেরত পাওয়ার পরে এটি বন্ধ হয়ে যাওয়ার পরে int x থেকে ভিন্ন হতে পারে। অবশ্যই E1 জানেন না, বা এই সম্পর্কে যত্ন। আপনি সহজেই ওওপি ছাড়াই এটি সমাধান করতে পারেন কেবল আপনাকে সচেতন থাকতে হবে যে আপনি একই ফাংশন (গুলি) একাধিক থ্রেড থেকে কল করছেন তাই আপনাকে থ্রেড নিরাপদ হতে হবে। OOP এর সাথে বা ছাড়াও আপনাকে প্রতিটি EA এ একটি পৃথক int X আলাদা করার উপায় থাকতে হবে। অতএব প্রতিটি ইএ-তে বৈশ্বিক ভেরিয়েবলগুলির একটি পৃথক 'ব্যাংক' অ্যালায় একটি ইনিট ফাংশন সরবরাহ করার প্রয়োজন। উপরের উদাহরণে এটি ইন্ট এক্সটিকে উপযুক্ত আকারের অ্যারে তৈরি করে সহজেই অর্জন করা যেতে পারে এবং init ফাংশনে প্রতিটি অনন্য কলারের জন্য অ্যারেডেনিট ফাংশনগুলি অ্যাল অ্যারে মাত্রা উপাদান সরবরাহ করে। যেমন, E1 int myID = DLLinit ('GBPJPY');/আয় 1 ফি 1 (myID);/এখন F1 বিশ্বব্যাপী অ্যারে সঠিক এক্স Var উল্লেখ করতে MyID ব্যবহার করতে পারে। E2 int myID = DLLinit ('EURUSD');/আয় 1 OOP প্রায়শই এই সমস্যাটি সমাধান করার জন্য আরও অনেক মার্জিত উপায় কিন্তু আপনি যদি সমস্যাটি বুঝতে পারেন এবং কেবল সঠিকভাবে কোড করেন তবেই এটি কাজ করবে। OOP এর সাথে আপনি একটি নতুন বস্তু তৈরি করতে চাইছেন (প্রতিটি EA এর জন্য একটি) যখন তারা একটি DLL init ফাংশন কল করে। এটি শুধুমাত্র তখনই কাজ করবে যদি আপনি প্রতিটি নতুন বস্তুর মধ্যে 'গ্লোবাল' ভেরিয়েবলগুলির একটি পৃথক সেটকে এনক্যাপুলিউলেট করেন।

  3. #13
    7 বিবিট: আমি কোড পরিবর্তন করেছি গ্লোবাল ভেরিয়েবলের সেই দম্পতি না, আমি এমনকি কোডটি পেস্ট না হওয়া পর্যন্ত আমি এমনকি তাদের লক্ষ্যও দেখিনি, আপনার নিশ্চিতকরণের সাথে যে তারা কলগুলির মধ্যে স্থির করে তোলে কারণ এটি কী ছিল । আমি আপনাকে ডেমো পরীক্ষার সাথে কিভাবে পেতে উপর জানাতে হবে। আমি এখন আপনার নিবন্ধটি দেখতে হবে, আমি এটা পড়তে পারে, আপনি এই দিন এত পড়া! আবারও একবার ধন্যবাদ

  4. #14
    রেঞ্জবাউন্ড: আপনার পোস্টের জন্য ধন্যবাদ, আমি যে সমস্যাটি ভুল করেছি তা আমি দেখতে পাচ্ছি যে আমি মনে করি যে প্রতিটি ইএ লোড DLL এর পৃথক উদাহরণ লোড করবে, যা হয়তো চলছে অন্যান্য কল থেকে আলাদাভাবে আলাদা। সম্পূর্ণরূপে আপনার উদাহরণ সঙ্গে একমত। যথেষ্ট বুদ্ধিমান এই বুদ্ধিমান আমার আসলে অন্য সমস্যা আমি একটি সমাধান দেওয়া হয়েছে, উত্তর সব বরাবর ছিল। আপনার সাহায্যের জন্য ধন্যবাদ

  5. #15
    আমি আপনাকে ধন্যবাদ বলতে চাই! 7bit এবং তাদের সহায়তার জন্য পরিসীমা এখানে। এটা আমার খুব উপকারে লেগেছে। আমি আমার DLL লিখতে ডেলফি ২009 (অবজেক্ট পাসকাল) ব্যবহার করছি। এই থ্রেডে পরামর্শটি ব্যবহার করে এবং এই একটিকে আমি সমস্ত ক্র্যাশগুলিকে একটি ক্লাসে সরানোর মাধ্যমে এবং MT4 এবং DLL এর মধ্যে বস্তুর একটি পয়েন্টার প্রেরণ করে ফেলেছি। এই কোনো মেমরি সংঘর্ষ সমাধান। তবে, মনে হচ্ছে এমন কিছু আছে যা আমি বুঝতে পারছি না। সমস্ত ক্র্যাশিং এড়ানোর জন্য, একটি টিএইচট্রিকাল সেশন ব্যবহার করতে হবে যাতে একমাত্র চার্ট DLL অ্যাক্সেস করতে পারে। উদাহরণস্বরূপ: ঢোকানো কোড/ডেলফি (বস্তু পাসকাল) DLL কোড: var csTick: TCriticalSection; ফাংশন DLLGet: বুলিয়ান; শুরু csTick.Enter; ফলাফল: = সত্য; শেষ; পদ্ধতি DLLFree; csTick.Leave শুরু করুন; শেষ; শুরু csTick: = TCriticalSection। তৈরি করুন; চূড়ান্তকরণ csTick.Free; ঢোকানো কোড/ইএ কোড: #import MyLogic.dll bool DLLGet (); বাতিল DLLFree (); #import int init () {DLLGet (); int iPointer = DLLGetNewObject (প্রতীক ()); ... অন্য সূচনা ... DLLFree (); প্রত্যাবর্তন (0); } int শুরু () {স্ট্যাটিক int intrevOrderCount = 0; DLLGet (); ... একাধিক DLL ফাংশন কল ... DLLFree (); প্রত্যাবর্তন (0); } আবার, আমি DLL কোন বিশ্বব্যাপী ওয়ার আছে; সবকিছু (TCriticalSection object ছাড়া) ক্লাসে মোড়ানো হয় এবং ক্লাস রেফারেন্সটি প্রতিটি ফাংশন কল সহ DLL এ প্রেরিত হয়। কিন্তু আমি এখনও কিছু ধরণের সংঘর্ষদুর্নীতি পাচ্ছি কারণ আমাকে সঠিকভাবে কাজ করার জন্য থ্রেড সেমফোর (টিক্রিটিকালসেকশন) ব্যবহার করতে হবে। এখানে আমি এই সব আনয়ন করছি কারণ। এখনও একটি ছোটখাটো সমস্যা রয়েছে: যদি ডিনিট () একটি চার্টের জন্য ডাকা হয়, MT4 অবিলম্বে শুরু () ফাংশন থেকে বিরত থাকে, যা কখনও কখনও DLLFree () ডেলিভারি বলে না এবং অন্যান্য সমস্ত চার্ট DLL থেকে লক হয়ে যায়। সুতরাং সারসংক্ষেপে আমার প্রশ্ন হলঃ কেন টিসিট্রিকালেশন সেমফোর ব্যবহার করতে হবে? যদি সবকিছু একটি বর্গ মধ্যে হয়, অন্যান্য সংঘর্ষ কি হতে পারে? ধন্যবাদ!

  6. #16
    আমার খারাপ
    । আমি একটি অন্তর্ভুক্ত ইউনিট একটি বিশ্বব্যাপী var খুঁজে পাওয়া যায় নি। আমি যে var মুছে ফেলা হয়েছে এবং সব ঠিক আছে - Semaphores জন্য প্রয়োজন ছাড়া! সাহায্যের জন্য আপনাকে আবারও ধন্যবাদ.

  7. #17
    আপনি অধিকাংশ DLLs জন্য জটিল বিভাগগুলি ব্যবহার করতে হবে উচিত নয় তাই এটি অন্য কিছু অন্তর্নিহিত কোডিং সমস্যাকে নির্দেশ করে, যা অনেকগুলি জিনিস হতে পারে। আপনি যা করতে পারতেন তা হল ... আপনার DLL থেকে কাট কোডটি যতক্ষণ পর্যন্ত না আপনার কাছে সবচেয়ে মৌলিক DLL থাকে তা ক্র্যাশ করে। তারপর এখানে উৎস পোস্ট করুন এবং আমি একটি চেহারা নিতে হবে। মনে হচ্ছিল যে যখন কোন ক্র্যাশ ঘটে তখন আপনি কোনও অবস্থা দেখেন না ... যদি আপনি সেই রুটটি নিচে যেতে চান না তবে আমার সেরা অনুমানগুলি হল: 1) আপনার EA একটি ডেনিটইনিট করে তবে আপনার DLL অন্য কোনও বস্তু তৈরি করার চেষ্টা করতে পারে একই মুদ্রা জোড়া। আপনি dupliion বন্ধ একটি ফাঁদ কোডেড আছে। আপনার ডিএলএল একটি DeInit কল পেতে নিশ্চিত করা হয় না অনুমান। আপনি একই মুদ্রার প্রাথমিকীকরণের সদৃশ জন্য চেক করতে হবে। 2) আপনি কি DLL এই বস্তুর ধ্বংস করার জন্য পয়েন্টারগুলি সংরক্ষণ এবং পরিচালনা করছেন?

  8. #18
    ধন্যবাদ রেঞ্জবাউন্ড! সবকিছু ঠিকঠাক কাজ করছে, কোনও ক্র্যাশ বা মেমরি লিক নেই তবে আপনার পোস্টটি কয়েকটি প্রশ্ন উত্থাপন করে:
    Quote Originally Posted by ;
    1) যদি আপনার ইএ একটি ডেনিটইনিট করে তবে আপনার DLL একই মুদ্রা জোড়ার জন্য দ্বিতীয় বস্তু তৈরি করার চেষ্টা করতে পারে। আপনি dupliion বন্ধ একটি ফাঁদ কোডেড আছে। আপনার ডিএলএল একটি DeInit কল পেতে নিশ্চিত করা হয় না অনুমান। আপনি একই মুদ্রার প্রাথমিকীকরণের সদৃশ জন্য চেক করতে হবে।
    যেভাবে আমি এটি লিখেছি, যদি deinit () কল না হয়, বস্তুটি মুক্ত হবে না। কিন্তু মেমরি লিক থেকে যে বিপর্যয় ঘটবে না কারণ দ্বিতীয় বস্তু একটি নতুন মেমরি loion আছে, সঠিক?
    Quote Originally Posted by ;
    2) আপনি কি DLL এই বস্তুর ধ্বংস করার জন্য পয়েন্টারগুলি সংরক্ষণ এবং পরিচালনা করছেন?
    সাধারণভাবে আমি টিএলহ্রেডলিস্ট (পয়েন্টারগুলির একটি থ্রেড-ব্লকিং তালিকা) ব্যবহার করতে চাইলে DLL এটিকে এমন কিছু করতে হবে - অন্য কোন উপায় আছে? অন্য কথায়, গ্লোবাল ওয়ার বা কিছু ব্লকিং প্রক্রিয়া ব্যবহার না করে আমি কীভাবে DLL এ পয়েন্টারগুলি সংরক্ষণ করব? এই খুব সহায়ক - আপনার ইনপুট জন্য ধন্যবাদ।

  9. #19

    Quote Originally Posted by ;
    সাধারণভাবে আমি টিএলহ্রেডলিস্ট (পয়েন্টারগুলির একটি থ্রেড-ব্লকিং তালিকা) ব্যবহার করতে চাইলে DLL এটিকে এমন কিছু করতে হবে - অন্য কোন উপায় আছে? অন্য কথায়, গ্লোবাল ওয়ার বা কিছু ব্লকিং প্রক্রিয়া ব্যবহার না করে আমি কীভাবে DLL এ পয়েন্টারগুলি সংরক্ষণ করব?
    সব সময়ে dll পয়েন্টার সংরক্ষণ করবেন না। তাদের 32 বিট পূর্ণসংখ্যাগুলিত� � আটকে দিন, তাদের EA- এ সঞ্চয় করুন, তাদের কিছু ধরণের সংস্থান হ্যান্ডলগুলি ব্যবহার করুন এবং ডেলের মধ্যে ফিতা-ফাংশনগুলির জন্য প্যারামিটার হিসাবে পাস করুন (যা তখন তাদের পশ্চাদপসরণ করবে, তাদের ডিফেন্স করবে এবং তারপরে প্রকৃত পদ্ধতিটি কল করবে বস্তুর উদাহরণ)। আমি আমার পাইথন বাঁধাই এই কাজ করছি। Python26.dll এ সমস্ত পাইথন বস্তু প্রকৃতপক্ষে পয়েন্টার তবে আমি সহজেই এমকিএল কোড দ্বারা ব্যবহার করা পূর্ণসংখ্যাগুলির মতো তাদের সাথে চিকিত্সা করতে পারি। আমার সমস্ত পাইথন এপিআই রপার ফাংশন যা একটি পাইথন বস্তুর একটি পয়েন্টার প্রয়োজন কেবল একটি পূর্ণসংখ্যা গ্রহণ করে, এমকিউএল কোডের জন্য সব পাইথন বস্তুগুলি কেবল পূর্ণসংখ্যা হ্যান্ডলগুলি।

  10. #20

    Quote Originally Posted by ;
    সব সময়ে dll পয়েন্টার সংরক্ষণ করবেন না। তাদের 32 বিট পূর্ণসংখ্যাগুলিত� � আটকে দিন, তাদের EA- এ সঞ্চয় করুন, তাদের কিছু ধরণের সংস্থান হ্যান্ডলগুলি ব্যবহার করুন এবং ডেলের মধ্যে ফিতা-ফাংশনগুলির জন্য প্যারামিটার হিসাবে পাস করুন (যা তখন তাদের পশ্চাদপসরণ করবে, তাদের ডিফেন্স করবে এবং তারপরে প্রকৃত পদ্ধতিটি কল করবে বস্তুর উদাহরণ)। আমি আমার পাইথন বাঁধাই এই কাজ করছি। Python26.dll এ সমস্ত পাইথন বস্তু প্রকৃতপক্ষে পয়েন্টার তবে আমি সহজেই এমকিএল কোড দ্বারা ব্যবহার করা পূর্ণসংখ্যাগুলির মতো তাদের সাথে চিকিত্সা করতে পারি। আমার সব পাইথন এপিআই মোড়ানো ফাংশন যা একটি পাইথন একটি পয়েন্টার প্রয়োজন ...
    হ্যাঁ, ঠিক যেটা আমি করছি, কিন্তু রেঞ্জবাউন্ড এমন বস্তুর উদ্বেগ উত্থাপিত করেছে যা ডাইনিট () নামক নাও হতে পারে, এবং প্রস্তাবিত যে আমি DLL এ পয়েন্টারগুলির একটি তালিকা সঞ্চয় করি যাতে এটি মেমরি পরিচালনা করতে পারে।

পৃষ্ঠা 2 মোট পৃষ্ঠা 435 FirstFirst 1234 ... সর্বশেষসর্বশেষ

অনুমতি প্রদান

  • আপনি হয়তো নতুন থ্রেড পোস্ট করবেন না
  • আপনি হয়তো উত্তর পোস্ট করবেন না
  • আপনি হয়তো সংযুক্ত কিছু পোস্ট করবেন না
  • আপনি হয়তো আপনার পোস্ট এডিট করবেন না
  •  
  • বি বি কোড চালু
  • স্মাইলি চালু
  • [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.