PDA

View Full Version : سوال: مشکل در به کار بردن شی یک کلاس در Thread



baradar
جمعه 23 دی 1390, 15:46 عصر
با عرض سلام و خسته نباشید خدمت اساتید بزرگوار


من ابتدا یک آرایه از اشیاء یک کلاس را در قسمت متغیر های عمومی فرم تعریف کردم که به صورت پویا هست و پس از باز کردن اطلاعات اون آرایه بر اساس خطوط اون فایل متنی مقدار دهی میشه و متنهای اون فایل هم که تفکیک میشن برای مقدار دهی متغیر های اون شی از کلاس مورد استفاده قرار میگیرند خب تا اینجا که چیز خاصی نبود و توصیح کلی بود حالا وقتی من میخوام یه تابع داخل اون شی کلاس یا بهتر بگم اون کلاس که من میخوام اجراش کنم و چون اشیاء زیادند داخل حلقه قرارش میدم و داخل یک Thread خب اون متغیر ها را مقدار دهی میکنه ولی وقتی نوبت به صدا زدن اون تابع میشه دچار خطا میشه من میخوام از Thread استفاده کنم و نمیتونم هم از Synchronize استفاده کنم چون باعث هنگ شدن برنامه میشه دوستان لطفا اگر راه حلی به نظرشون میرسه بنده را راهنمایی نمایید

نمونه کد تعریف آرایه
m : Array of Tmsg;

نمونه کد مقدار دهی

m[i]:=Tmsg.Create(nil);
m[i].user:='test';
m[i].pass:='test';


نمونه کدی که من درThread صدا میزنم و یک پروسیجر از اون شی کلاس هست و خطا میده


if Assigned(m[i]) then
if m[i].ConectionState then
کد مورد نظر



در اینجا به شرط دوم که میرسه خطا میده

با تشکر

Felony
جمعه 23 دی 1390, 16:32 عصر
خطا چی میده ؟ باید حدس بزنیم ؟!
کدتون رو کامل بنویسید , متن خطا رو کامل بنویسید ...

baradar
جمعه 23 دی 1390, 17:14 عصر
با سلام و تشکر از پاسختون
مهندس جان خطا مهم نیست این یه حرف کلیه چون من جاهای دیگه هم نیاز دارم با کلاسهای دیگه من که نمیتونم هر دفعه مزاحم شما بشم خطاها را ببینید
یک راه حل کلی و درست میخوام که بتونم از توابع اون شی کلاس که در قسمت متغیر های عمومی زیر کلاس فرم و thread هست که هنگام باز کردن فایل یک خانه در آرایه ساخته
شده که حاوی شی اون کلاس هست و به ازای هر خط اون فایل ساخته میشه میخوام بتونم از داخل thread به توابع اون شی که قبلا گفتم چطور ساخته میشه دسترسی داشته باشم چون خود فرم هم باید دسترسی داشته باشه
نمیتونم داخل کلاس thread تعریفش کنم و باید یه چیز مشترک باشه بین فرم و thread لطفا راهنمایی بفرمایید

در ضمن نمیتونم هم از Synchronize استفاده کنم چون باعث هنگ شدن برنامه میشه

Mahmood_M
جمعه 23 دی 1390, 18:53 عصر
مهندس جان خطا مهم نیست این یه حرف کلیه چون من جاهای دیگه هم نیاز دارم با کلاسهای دیگه من که نمیتونم هر دفعه مزاحم شما بشم خطاها را ببینید
یک راه حل کلی و درست میخوام که بتونم از توابع اون شی کلاس که در قسمت متغیر های عمومی زیر کلاس فرم و thread هست که هنگام باز کردن فایل یک خانه در آرایه ساخته
وقتی صورت سئوال رو مشخص نکنید ، نمی تونید جواب درستی بگیرید ، وقتی عنوان می کنید که در خط X خطایی ظاهر میشه و دلیلش رو می خواید بدونید ، اول باید مشخص کنید که دلیل چه خطایی رو می خواید بدونید ! ، اگر قرار بود برای هر مشکلی یک راه حل کلی و ثابت وجود داشته باشه که کامپایلر دلفی روی نمایش خطاهای برنامه اینقدر دقت به خرج نمی داد
ممکنه مشکل از جای دیگه ای باشه که اصلا ربطی به کلاس و ... نداره
در هنگام پرسیدن یک سئوال درباره ی یک " خطا " ، دقیقا مهمترین و اولین چیزی که باید ذکر کنید "متن خطا" و خطی هست که خطا بر روی اون ظاهر میشه

در ضمن نمیتونم هم از Synchronize استفاده کنم چون باعث هنگ شدن برنامه میشه
این یعنی اینکه نحوه ی استفاده از Synchronize در برنامتون اشتباه هست ، برای پیدا کردن اینکه کجای کار اشتباه هست باید کدتون رو ببینیم و نظر بدیم ، وگرنه جواب ها در حد چند احتمال خواهند بود

لطفا سئوال رو با جزئیات کامل بپرسید تا جواب درستی بگیرید و از ایجاد پستهای اضافی ( مثل همین پست بنده ) در تاپیک جلوگیری کنید

موفق باشید ...

baradar
پنج شنبه 29 دی 1390, 15:15 عصر
با عرض پوزش از دوستان به خاطر تاخیر

ببینید من اصلا کد آنچنانی که فکر میکنید ندارم یه تابع تعریف میکنم در کلاس Thread وبعد این کد زیر را داخلش میگذارم البته داخل یه حلقه هست که باید دائم چک بشه کدش اینه


if m[i].ConectionState then
کد مورد نظر



بعد میام در متد execute تابع را صدا میزنم که وقتی تابع را بدون Synchronize صدا میزنم جواب نمیده و با Synchronize هم بخوام فراخوانیش کنم خب طبیعتا
جای Thread اصلی برنامه ثرار میگیره و هنگ میکنه ولی درست کار میکنه وقتی با Synchronize فراخوانی میشه من میخوام بدون این Synchronize فراخوانی بشه
دوستان یه نکته ای که هست من میتونم خصوصیات این شی کلاس را مقدار دهی کنم داخل همون تابع Thread اما نمیتونم هیچ کدوم از procedure هاش را فراخوانی کنم
لطفا راهنمایی کنید اگر باید کار اضافه ای انجام بدم من را راهنمایی کنید

یه نکته اینکه اون i که من اندیس شی گذاشتم یه متغیر هست که از 1 هست تا 100 و من در حلقه چون بینهایت هست میام در هر دور اجرا یکی بهش اضافه میکنم و بعد وقتی رسید به 100 میگم که مقدارش
1 بشه و اینطوری من هر 100 شی را توابعشون را فراخوانی میکنم

با تشکر