PDA

View Full Version : مشکل با تعریف تردها در یک dll



anubis_ir
چهارشنبه 12 بهمن 1384, 12:07 عصر
سلام

در یک برنامه که از کلاس Tthread در آن استفاده می‌شود اگر به صورت فایل exe معمولی اجرا شود هیچ مشکلی وجود ندارد و دقیقا تابع Synchronize جهت به روز آوری رابط کاربر در روال Execute آن کار می کند.
اما اگر این کد درون یک dll قرار گیرد دیگر تابع Synchronize کار نمی کند! چرا؟
اگر تابع Synchronize را حذف کنم dll به خوبی کار می‌کند ولی بسیار ناپایدار خواهد بود و سبب هنگ برنامه پس از مدتی می شود. (البته بورلند هم توصیه کرده که حتما به روز آوری رابط کاربر بدلیل thread safe نبودن کامپوننت‌های VCL باید به همراه Synchronize باشد. اما درون یک dll به چه صورت است؟ و چرا کار نمی کند؟)

با تشکر

vcldeveloper
پنج شنبه 13 بهمن 1384, 09:01 صبح
یه نمونه از کدها تون را هم اینجا بزارید تا بشه تشخیص داد مشکل از کجا ست.


(البته بورلند هم توصیه کرده که حتما به روز آوری رابط کاربر بدلیل thread safe نبودن کامپوننت‌های VCL باید به همراه Synchronize باشد. اما درون یک dll به چه صورت است؟ و چرا کار نمی کند؟)


حتما ایی وجود نداره، بلکه تابع Synchronize ساده ترین راهی هست که می تونید رابط کاربر را بروز کنید. راههای دیگه ایی هم برای همزمان سازی Thread ها وجود دارند که از Synchronize بهینه تر ولی پیچیده تر هستند.

anubis_ir
سه شنبه 18 بهمن 1384, 07:13 صبح
سلام
مجبور به استفاده از Synchronize هستم چون امکان آپدیت user interface از ترد دیگری بجز ترد اصلی برنامه وجود ندارد و برنامه هنگ خواهد کرد. فراخوانی این تابع سبب می شود که کار آپدیت در ترد اصلی برنامه صورت گیرد.

Naficy
سه شنبه 18 بهمن 1384, 11:22 صبح
ببینید، برای آپدیت کردن ui از درون ترد اصلی، نه تنها همونطور که آقای کشاورز گفتند می توانید از روشهایی غیر از synchronize برای همزمان سازی تردها استفاده کنید، بلکه راههای ساده تری هم وجود دارند. (راههای غیر از همزمان سازی)
مثلا می تونید یک message به یکی از فرمهای برنامه تان ارسال کنید. سپس ترد اصلی هنگام پردازش آن پیغام، ui را بروز کند.
پیشنهاد می کنم در مورد ترد ها بیشتر مطالعه کنید. (البته تا همینجا هم اطلاعات مفیدی در حیطه دلفی دارید، اما منظورم استفاده از منابعی مثل msdn است که وابسته به دلفی نباشند)