سؤال

أود أن تكون قادرة على فتح TDataSet بشكل غير متزامن في موضوع خاص بها بحيث الرئيسية VCL موضوع يمكن أن تستمر إلى أن يتم ذلك ، ومن ثم يكون الرئيسي VCL موضوع قراءة من أن TDataSet بعد ذلك.لقد فعلت بعض التجارب قد حصلت في بعض غريب جدا الحالات, لذلك أنا أتساءل عما إذا كان أي شخص قد فعلت هذا من قبل.

لقد رأيت بعض تطبيقات عينة حيث TDataSet يتم إنشاؤه في موضوع مستقل ، فتحها ومن ثم قراءة البيانات من ذلك ، ولكن هذا هو كل ما فعلت في مؤشر ترابط منفصل.أنا أتساءل إذا كان من الآمن أن قراءة من TDataSet من VCL موضوع بعد موضوع آخر فتح مصدر البيانات.

أنا أفعل Win32 البرمجة دلفي 7, باستخدام TmySQLQuery من لجنة المساعدة الإنمائية من أجل MySQL كما TDataSet سليل.

هل كانت مفيدة؟

المحلول

شريطة أن كنت ترغب فقط في استخدام البيانات في موضوع خاص بها, يمكنك فقط استخدام مزامنة للتواصل مع موضوع الرئيسي لأي VCL/تحديث واجهة المستخدم ، مثل مع أي مكون آخر.
أو, أفضل, يمكنك تنفيذ الاتصالات بين mainthread والعمال المواضيع الخاصة بك مع نظام الرسائل.

تحقق Hallvard حل خيوط هنا:
http://hallvards.blogspot.com/2008/03/tdm6-knitting-your-own-threads.html

أو هذا واحد:
http://dn.codegear.com/article/22411

بعض التفسير على مزامنة و عدم الكفاءة:
http://www.eonclash.com/Tutorials/Multithreading/MartinHarvey1.1/Ch3.html

نصائح أخرى

لقد رأيت ذلك مع تطبيقات أخرى TDataSet ، وهي في Asta مكونات.هذه الاتصال الملقم العودة على الفور ، ومن ثم إطلاق حدث مرة واحدة البيانات التي تم تحميلها.

ومع ذلك, أعتقد أن ذلك يعتمد كثيرا على العنصر.على سبيل المثال ، نفس تلك Asta مكونات تعذر فتح في نحو متزامن من أي شيء آخر سوى الرئيسي VCL الموضوع.

لذلك باختصار أنا لا أصدق ذلك هو الحد من TDataSet في حد ذاته ، بل ما هو تنفيذ محددة ، وأنا لم يكن لديك الوصول إلى مكونات لقد ذكرت لك.

شيء واحد أن نأخذ في الاعتبار حول استخدام نفس TDataSet بين مواضيع متعددة يمكنك فقط قراءة السجل الحالي في أي وقت.حتى إذا كنت تقرأ سجل في موضوع واحد ثم موضوع آخر المكالمات القادم فأنت في ورطة.

أيضا تذكر موضوع المرجح أن تحتاج قاعدة البيانات الخاصة بها اتصال.أعتقد أن ما هو مطلوب هنا هو متعدد الخيوط "القابضة" وجوه تحميل البيانات من موضوع في (كتابة فقط) ثم قراءة فقط من VCL الموضوع.قبل قراءة استخدام نوع من تطبيق طريقة لضمان أن لا تقرأ نفس لحظة الكتابة ، أو كتابة نفس اللحظة القراءة الخاصة بك, أو تحميل كل شيء في الذاكرة الملف وكتابة طريقة المزامنة أن أقول التطبيق الرئيسي حيث في الملف إلى التوقف عن القراءة.

لقد اتخذت النهج الأخير عدة مرات ، depdending على عدد من المتوقع السجلات (و حجم البيانات) حتى لقد اتخذت هذا إلى القرص الفعلي الملف على النظام المحلي.أنه يعمل بشكل جيد جدا.

لقد فعلت مؤشرات الوصول إلى البيانات ، وانها ليست واضحة:

1) تحتاج إلى إنشاء دورة في الموضوع.

2) كل ما فعلت ذلك TDataSet سبيل المثال يجب أن يتم في سياق الموضوع الذي تم إنشاؤه.هذا ليس من السهل إذا كنت تريد أن تضع على سبيل المثالdb الشبكة على أعلى من ذلك.

3) إذا كنت ترغب في السماح على سبيل المثالالترابط الرئيسي تلعب مع البيانات الخاصة بك ، على التوالي إلى الأمام الحل هو التحرك في وعاء منفصل من نوع ما ، على سبيل المثالذاكرة البيانات.

4) كنت في حاجة إلى نوع من آلية يشير إخطار الترابط الرئيسي بمجرد استرجاع البيانات كاملة.

و التعامل مع استثناء ليست واضحة ، إما...

ولكن:مرة واحدة كنت قد نجحت ، التطبيق سوف تكون أنيقة حقا !

معظم TDatasets ليست موضوع آمنة.واحد أعرفه هو موضوع آمنة kbmMemtable.كما أن لديها القدرة على استنساخ البيانات بحيث المشكلة من تحريك سجل مؤشر (كما أوضح جيم McKeeth) لا تحدث.إنهم واحدة من أفضل قواعد البيانات يمكنك الحصول على (اشترى أو مجانا).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top