ورود

View Full Version : سوال: مشکل با ترد در ارتباط با فرم



mohammad4353
یک شنبه 10 دی 1396, 22:54 عصر
سلام.
زمانی که می خواهم از داخل ترد با یک کنترل ارتباط برقرار کنم در فرم اصلی مشکلی نداره ولی در فرم دوم قرارش میدم و اجراش میکنم اتفاقی نمیفته.
البته اینم بگم وقتی فرم2رو بصورت Form2.Show نمایش میدم مشکلی نداره ولی اگه بصورت
Form2 := TForm2.Create(Self)
Form2.Show نمایش بدم ترد چیزی نمایش نمیده.
متشکر میشم راهنمایی کنید.

یوسف زالی
دوشنبه 11 دی 1396, 10:04 صبح
سلام. کدتون رو بگذارید.

mohammad4353
دوشنبه 11 دی 1396, 10:29 صبح
برنامه خاص نمی نوشتم داشتم مباحث ترد تو دلفی یاد میگرفتم تو یه مثال به این مشکل برخوردم.

Mahmood_M
دوشنبه 11 دی 1396, 13:55 عصر
اصل اول کار با ترد ها اینه که از داخل یک ترد به عناصر Visual برنامه دسترسی مستقیم نداشته باشید، تمام ترسیمات گرافیکی باید در ترد اصلی انجام بشه
برای تغییر بر روی عناصر ویژوال باید از روشهای Synchronization استفاده کنید، ساده ترین حالت استفاده از دستور Synchronize هستش، مثال :


procedure TMyThread.Execute;
begin
Synchronize(aaa);

// OR

Synchronize(Procedure
begin
Form2.Caption := '12345';
end);
end;
با دستور Synchronize متدی که به عنوان ورودی میدید در بدنه ترد اصلی اجرا میشه
در حالت کلی استفاده از منابع مشترک در چند ترد باید با روشهای Synchronization مدیریت بشه

برای متد Execute نیازی به استفاده از Inherited نیست

mohammad4353
دوشنبه 11 دی 1396, 14:20 عصر
از دستور Synchronize استفاده میکنم بازم کد Form2.Caption := '12345' اجرا نمیشه.

Mahmood_M
دوشنبه 11 دی 1396, 14:42 عصر
در فرم اول Form2 رو به صورت Dynamic ساختید، متغیر Form2 که در Thread ازش استفاده کردید متغیر عمومی هستش که در یونیت مربوط به Form2 تعریف شده اما متغیر Form2 که فرم ساخته شده رو بهش اختصاص دادید یک متغیر Local هستش که در Event کلیک Button تعریف شده
متغیری که در ترد استفاده شده Nil هستش و چیزی بهش اختصاص داده نشده
یا باید روش کار رو تغییر بدید یا اینکه در فرم اول مستقیما از متغیر Form2 تعریف شده در یونیت فرم دوم استفاده کنید :

procedure TForm1.Button1Click(Sender: TObject);
begin
Form2 := TForm2.Create(Self);
Form2.Show;
end;

mohammad4353
دوشنبه 11 دی 1396, 15:05 عصر
یا باید روش کار رو تغییر بدید یا اینکه در فرم اول مستقیما از متغیر Form2 تعریف شده در یونیت فرم دوم استفاده کنید

میشه بیشتر توضیح بدبد.