ورود

View Full Version : سوال: مشکل ساختن فرم در thread



محسن م
شنبه 13 شهریور 1389, 00:53 صبح
سلام
من یه کلاس از نوع thread دارم که تو execute اون دستور aplication.createform() رو اجرا میکنم اما فرم ساخته نمیشه و برنامه هم قفل میکنه؟کسی می دونه مشکل چیه؟پیشاپیش از همتون مممنونم.

vcldeveloper
شنبه 13 شهریور 1389, 02:38 صبح
ساخت فرم در Thread ایی غیر از Thread اصلی امکان پذیر هست، ولی همچین چیزی توصیه نمیشه. بر فرض که بخواید همچین کاری کنید، باید خودتون یک Message loop در داخل Thread بنویسید، و پیام های مربوط به اون فرم رو به WndProc آن فرم ارسال کنید.

هدفتون از ساخت یک فرم در داخل یک Thread دیگه چی هست؟ اگر هدفتون مشخص بشه، میشه راهکارهای بهتری ارائه کرد.

محسن م
شنبه 13 شهریور 1389, 13:43 عصر
ممنون از راهنماییتون.من برنامه ای نوشتم که در کنار کارهایی که انجام میده باید هر موقع که یک sms از GSM MODEM دریافت کرد متن اون رو با اطلاعات داخل دیتابیس چک کنه و بعد مواردی رو روی یک فرم به کاربر نشون بده،برای اینکه این عمل باعث متوقف شدن دیگر کارهای کاربر نشه اون روی توی یک thread انجام دادم اما مشکل اینجاست که دستور craeatform اجرا نمیشه.در ضمن من منظورتون رو از thread اصلی متوجه نمی شم.کدام thread اصلیه؟البته من داخل این thread یک thread دیگر رو هم واسه ساختن فرم فراخوانی کردم اما مشکل حل نشد.جالب اینجاست که هیج error ایی هم نمیده فقط برنامه متوقف میشه.اگه میشه بیشتر در مورد thread اصلی و message loop توضیح بدین.

Felony
شنبه 13 شهریور 1389, 17:33 عصر
برنامه شما وقتی اجرا میشه به صورت خودکار یه ترد داره ، به این ترد میگن ترد اصلی ( Main Thread ) که تمامی دستورات معمولی که در برنامه مینویسید توسط این ترد پردازش میشه مگر اینکه ترد جدیدی برای انجام عملیات مورد نظرتون تعریف کنید ، در مورد سوالی گه پرسیدید شما لازم نیست فرم رو تو یه ترد دیگه بسازید ؛ با توجه به اینکه کار زمانگیر شما در این عملیات جست و جو در بانک هست کافیه کار جست و جو رو به یه ترد جدا بسپارید تا رابط کاربری برنامه فریز نشه و بعد از اتمام جست و جو با یک پیغام یا ... برنامه رو از اتمام جست و جو مطلع کنید و فرم و نتایج جست و جو رو نمایش بدید .

vcldeveloper
شنبه 13 شهریور 1389, 18:55 عصر
من برنامه ای نوشتم که در کنار کارهایی که انجام میده باید هر موقع که یک sms از GSM MODEM دریافت کرد متن اون رو با اطلاعات داخل دیتابیس چک کنه و بعد مواردی رو روی یک فرم به کاربر نشون بده،برای اینکه این عمل باعث متوقف شدن دیگر کارهای کاربر نشه اون روی توی یک thread انجام دادم اما مشکل اینجاست که دستور craeatform اجرا نمیشه.در ضمن من منظورتون رو از thread اصلی متوجه نمی شم.کدام thread اصلیه؟البته من داخل این thread یک thread دیگر رو هم واسه ساختن فرم فراخوانی کردم اما مشکل حل نشد.جالب اینجاست که هیج error ایی هم نمیده فقط برنامه متوقف میشه.اگه میشه بیشتر در مورد thread اصلی و message loop توضیح بدین.
نیازی به ایجاد فرم در Thread جدید ندارید، بلکه باید فقط عملیات مربوط به چک کردن دریافت SMS و ارسال آن به بانک اطلاعاتی را در یک Thread جداگانه قرار بدید، و هر زمان که نیاز بود چیزی به کاربر نمایش داده بشه، آن را از طریق یک پیام یا روش های مختلف Synchronization، به Thread اصلی ارسال کنید، تا اون Thread فرم های مربوطه را ایجاد کنه و نمایش بده.

در ضمن، حواستون باشه که کار با بانک اطلاعاتی در Threadهای مختلف هم ملاحظات خودش را داره، مثلا اگر از ADO استفاده میشه، باید COM در اون Threadها Initialize بشه، یا Connection دیتابیس رو معمولا نمیشه بین چند Thread به اشتراک گذاشت.

در هر حال، برنامه نویسی Multi-threading ملاحظات خاص خودش رو داره، و قبل از اینکه بخواید از این قابلیت ها استفاده کنید، حتما مطالعات زیادی در این زمینه انجام بدید، وگرنه با مشکلات پیچیده ایی مواجه میشید.

محسن م
شنبه 13 شهریور 1389, 22:12 عصر
ممنون از لطف دوستان.
راهنمایی شما باید مشکلم رو حل کنه و من سعی می کنم کار ساختن فرم رو خارج از THREAD انجام بدم.اما توجه داشته باشید که اصل مشکل پابرجاست و هنوز نمیشه درون THREAD دستور application.formcreate رو اجرا کرد.خواهش می کنم برای اینکه این پست به یه مرجع کامل واسه دیگر دوستانی که ممکنه با این مشکل برخورد کنن تبدیل بشه اون رو تا رسیدن به نتیجه کامل و حل مشکل ادامه بدین.

vcldeveloper
یک شنبه 14 شهریور 1389, 00:58 صبح
اما توجه داشته باشید که اصل مشکل پابرجاست و هنوز نمیشه درون THREAD دستور application.formcreate
برای اینکه اون متد FormCreate نهایتا منجر به ساخت یک Window میشه، همانطور که گفتم، یک Window برای اینکه کار کنه، باید Thread سازنده آن یک Message Loop داشته باشه. Thread شما هم همچین چیزی نداره. در Thread اصلی همچین کدی کار میکنه، چون خودِ دلفی کدهای لازم برای اون Message Loop را برای Thread اصلی تولید میکنه (می تونید به کد Application.Run در فایل DPR پروژه تون توجه کنید).