ساختن تابعی که در آن از تردها استفاده شود
سلام
می خواهم یک فانکشن بنویسم که در آن اطلاعاتی از یک وب سرور دریافت میشود. این وب سرویس خیلی سریع نیست و ممکن است باعث فریز شدن کل برنامه شود.
می خواستم این فانکشن را با ترد بنویسم اما معمولا در برنامه نویسی ترد در داخل فانکشن ترد را می سازیم ولی پاسخ را با OnMessage دریافت می کنیم در نتیجه نمی توان پاسخ را به عنوان result آن تابع برگرداند!
آیا راه حلی برای این مشکل وجود دارد؟
نقل قول: ساختن تابعی که در آن از تردها استفاده شود
سلام.
باید یک متد کال بک صدا زده بشه.به همراه پارامترهاتون یک متد هم پاس بدید و ترد در هنگام تمام شدن کارش اون رو صدا می زنه.
خروجی ای از تابع دریافت نمی کنید، چون اگر بنا باشه منتظر خروجی بمونید باز فریز می شید.
تابع رو هم به پروسیجر تغییر بدید.
چیزی مثل این:
type:
.
.
CallBackProc = procedure (Params: TParams);
.
.
thread:
.
.
if Assigned(CallBack) then
CallBack(Params);
.
.
program:
.
.
procedure CallBack(Params: TParams);
.
.
GetWebServiceResult(CallBack);
.
.
نقل قول: ساختن تابعی که در آن از تردها استفاده شود
سلام. همانطور که آقای زالی فرمودند روش طراحی کارها به روش مالتی ترد با حالت عادی تفاوت داره. اگر جایی نیاز بود تا توقف داشته باشید و منتظر نتیجه بمانید میتوانید از Future هم استفاده کنید که کلاسهای مربوطه در نسخه های جدید دلفی یعنی از نسخه XE7 به بعد وجود دارند. به عنوان یک مثال میتوانید از کدی که نوشته ام بهره لازم را ببرید:
uses System.Threading;
var
FutureInt: IFuture<Integer>;
procedure TForm3.Button1Click(Sender: TObject);
begin
TTask.Run(
procedure
var
resultInt : integer;
begin
FutureInt := TTask.Future<integer>(
function: Integer
begin
{ some calculation that takes time}
Sleep(3000);
Result := Random(1000);
end);
resultInt := FutureInt.Value;
TThread.Synchronize(nil,
procedure
begin
Caption := resultInt.ToString;
end);
end);
end;
موفق باشید ...