PDA

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



Kamyar.Kimiyabeigi
دوشنبه 15 آذر 1389, 11:10 صبح
من یک thread تعریف کردم که یکی از متدهاش پارامتر ورودی داره ولی وقتی صداش میکنم error میگیرم
تعرف thread


TMessageThread = class(TThread)
private
procedure CreateMessage(MsgStr: string; MsgCount: Integer);
public
procedure Execute; override;
end;


صدا زدن متد در thread


procedure TMessageThread.Execute;
begin
inherited;
while not Terminated do
begin
Synchronize(CreateMessage('dsf', 1));
end;
end;


متن error


There is no overloaded version of 'Synchronize' that can be called with these arguments

m-khorsandi
دوشنبه 15 آذر 1389, 19:24 عصر
The Synchronize method is used to avoid concurrent access to VCL components. The VCL code runs inside the program's main thread, and you need to synchronize access to VCL to avoid re-entry problems (errors from re-entering a function before a previous call is completed) and concurrent access to shared resources. The only parameter of Synchronize is a method that accepts no parameters, typically a method of the same thread class. Because you cannot pass parameters to this method, it is common to save some values within the data of the thread object in the Execute method and use those values in the synchronized methods.


راههایی وجود داره ولی اگه بگی دقيقاً ميخوای چی كار كنی، راحت‌تر ميشه مشكل رو حل كرد.

Kamyar.Kimiyabeigi
سه شنبه 16 آذر 1389, 07:34 صبح
راستش من میخوام متدی در thread داشته باشم که پارامتر ورودی بگیره همین....
فعلا مشکلمو با تعریف متغیر private داخل thread حل کردم اما کلا میخوام بدونم میشه همچین کاری کرد؟

Felony
سه شنبه 16 آذر 1389, 08:20 صبح
راستش من میخوام متدی در thread داشته باشم که پارامتر ورودی بگیره همین....
فعلا مشکلمو با تعریف متغیر private داخل thread حل کردم اما کلا میخوام بدونم میشه همچین کاری کرد؟

داخل اون روال CreateMessage چی کار میکنید ؟ با اجزای بصری برنامه مثل ProgreessBar یا ... ارتباط دارید ؟ اگر نه نیازی به استفاده از Synchronize نیست .

Kamyar.Kimiyabeigi
سه شنبه 16 آذر 1389, 09:01 صبح
فقط یک متن رو generate میکنم

Felony
سه شنبه 16 آذر 1389, 11:06 صبح
فقط یک متن رو generate میکنم

پس نیازی به استفاده از Synchronize نیست ، کد مربوط به رویداد Execute باید به شکل زیر نوشته بشه :

procedure TMessageThread.Execute;
begin
CreateMessage('Your String', n);
inherited;
end;

vcldeveloper
پنج شنبه 18 آذر 1389, 00:04 صبح
من یک thread تعریف کردم که یکی از متدهاش پارامتر ورودی داره
اگر کل کاری که thread شما انجام میده، همون کاری هست که اون متد باید انجام بده؛ نباید از Synchronize استفاده می کردید. قبلا هم توضیح دادم که Thread ایی که کاری جز فراخوانی یک یا چند متد از طریق Synchronize انجام نمیده، در واقع کل کارش به Thread اصلی محول میکنه، پس بودن اون Thread کمکی به کارایی برنامه تون نمیکنه، حتی میشه گفت موجب کاهش کارایی هم میشه، چون ایجاد Thread خودش سربار داره.



راستش من میخوام متدی در thread داشته باشم که پارامتر ورودی بگیره همین....
فعلا مشکلمو با تعریف متغیر private داخل thread حل کردم اما کلا میخوام بدونم میشه همچین کاری کرد؟
دریافت داده های مورد نیاز یک Thread از طریق پارامترهای متد سازنده آن، در هنگام ساخت یک شی از آن Thread، و ذخیره این داده ها در فیلدهای خصوصی کلاس مربوط به اون Thread؛ یکی از روش های مناسب در ارسال داده ورودی به Thread هست.

در هر حال، اگر نیاز به این دارید که داده ایی را با استفاده از متدهای Synchronize یا Queue به Thread دیگه ارسال کنید، و اون داده باید از طریق پارامترهایی به متد مربوطه برسه، در دلفی 2009 و نسخه های بعد از آن می تونید به راحتی از Anonymous Methods استفاده کنید:


Synchronize(procedure
begin
CreateMessage('dsf',1);
end);