دسترسی همزمان چند Thread

//دسترسی همزمان چند Thread

دسترسی همزمان چند Thread

برای اینکه بتوان به صورت همزمان از طریق چندین Thread به یک منبع داده مشترک دسترسی داشت باید عملیات Synchronization را انجام بدهیم تا همه Thread ها به صورت مدیریت شده و پشت سر هم بتوانند به داده مورد نظر دسترسی داشته باشند. حال اگر عملیات مذکور را انجام ندیم، Thread ها برای دسترسی به داده مورد نظر با یکدیگر درگیر شده و حالتی مانند Deadlock رخ میدهد که در آن هیچ کدام از پروسه ها امکان دریافت و آزاد کردن منابع را نخواهند داشت. برای این منظور برنامه را نوشته که چگونگی دسترسی همزمان چندیدن Thread به یک منبع داده اشتراکی عمومی را نشان میدهد.

خلاصه ی روش کار به این صورت است که یک منبع داده اشتراکی در Thread اصلی برنامه ایجاد کرده و دسترسی بقیه Thread ها را به آن Synchronize میکنیم. با توجه به نیازی که وجود داشت، از یک TStringList استفاده کردیم که به صورت عمومی تعریف شده و در کنار یک Message Handler اطلاعات دریافت شده از Thread های مختلف را در قالب رکوردهای رشته ای ذخیره میکند.

کدی که در زیر قرار داده شده است، سه Thread را به صورت همزمان به اجرا در می آورد. هر کدام از نخ ها وظیفه دارند با توجه به پارامتر ورودی که حاوی یک آدرس اینترنتی است، سورس Html صفحه اینترنتی را دریافت نموده و به Thread اصلی برگردانند تا نهایتاً نتایج به صورت پشت سر هم در یک کنترل Memo روی فرم قرار گیرند.
unit HttpThread;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, strutils,
IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, IdHTTP;
type
HThread = class(TThread)
protected
procedure Execute; override;
private
procedure AddToMainThread();

var
PgSource: string;
public
var
WM_Finished: DWord;
FrmHandle: integer;
Url: string;
end;
implementation
uses Unit1;
procedure HThread.AddToMainThread;
begin
Form1.Sources.Add(PgSource);
sendMessage(FrmHandle, WM_Finished, 8, 0);
end;
procedure HThread.Execute;
var
H: TIdHTTP;
ReplyData: TStringStream;
begin
Inherited;
H := TIdHTTP.Create(nil);
ReplyData := TStringStream.Create('', CP_UTF8);
try
H.HandleRedirects := true;
H.Get(Url, ReplyData);
PgSource := ReplyData.DataString;
finally
ReplyData.Free;
H.Free;
end;
if PgSource <> '' then
Synchronize(AddToMainThread);
end;
end.

۱۳۹۴-۸-۲ ۱۰:۴۱:۵۶ +۰۳:۳۰آبان ۲ام, ۱۳۹۴|Categories: مهندسی نرم افزار|Tags: |بدون ديدگاه

ثبت ديدگاه

پرداخت

1-پرداخت آنلاین
برای پرداخت آنلاین از لینک زیر استفاده کنید
پرداخت آنلاین
2- پرداخت آفلاین
برای پرداخت آفلاین مبلغ مورد نظر را به یکی از شماره کارت
6037997245888723بانک ملی