دسترسی همزمان چند Thread به Main Thread
- 3012 بازدید
- 1393/09/13
- 2 دیدگاه
برای اینکه بتوان به صورت همزمان از طریق چندین Thread به یک منبع داده مشترک دسترسی داشت باید عملیات Synchronization را انجام بدهیم تا همه Thread ها به صورت مدیریت شده و پشت سر هم بتوانند به داده مورد نظر دسترسی داشته باشند. حال اگر عملیات مذکور را انجام ندیم، Thread ها برای دسترسی به داده مورد نظر با یکدیگر درگیر شده و حالتی مانند Deadlock رخ میدهد که در آن هیچ کدام از پروسه ها امکان دریافت و آزاد کردن منابع را نخواهند داشت. برای این منظور برنامه را نوشته که چگونگی دسترسی همزمان چندیدن Thread به یک منبع داده اشتراکی عمومی را نشان میدهد.
خلاصه ی روش کار به این صورت است که یک منبع داده اشتراکی در Thread اصلی برنامه ایجاد کرده و دسترسی بقیه Thread ها را به آن Synchronize میکنیم. با توجه به نیازی که وجود داشت، از یک TStringList استفاده کردیم که به صورت عمومی تعریف شده و در کنار یک Message Handler اطلاعات دریافت شده از Thread های مختلف را در قالب رکوردهای رشته ای ذخیره میکند.
کدی که در زیر قرار داده شده است، سه Thread را به صورت همزمان به اجرا در می آورد. هر کدام از نخ ها وظیفه دارند با توجه به پارامتر ورودی که حاوی یک آدرس اینترنتی است، سورس Html صفحه اینترنتی را دریافت نموده و به Thread اصلی برگردانند تا نهایتاً نتایج به صورت پشت سر هم در یک کنترل Memo روی فرم قرار گیرند.
کد مربوط به ایجاد یک کلاسThread:
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.
همانطور که مشاهده میکنید کلاسی به اسم HThread ایجاد شده است که دارای متدی به نام AddToMainThread می باشد. این متد به صورت Synchronize صدا زده شده تا نتایج عملیات را برای Thread اصلی ارسال نماید. ضمناً از تابع ویندوزی به اسم sendMessage هم استفاده شده تا پس از اینکه نتایج منتقل شدند،Main thread هم با خبر شوند.
در Thread اصلی کدی شبیه این خواهیم داشت :
unit Unit1; interface type TForm1 = class(TForm) private procedure AddToMemo(); Procedure WndProc(var Message: TMessage); Override; var Ix: integer; public var WM_Finished: DWord; Sources: TStringList; end; var Form1: TForm1; implementation uses HttpThread; {$R *.dfm} procedure TForm1.AddToMemo; var i: integer; _S: string; begin inc(Ix); if Ix = 3 then Button1.Enabled := true; if Ix > 1 then _S := 's' else _S := ''; Label2.Caption := inttostr(Ix) + ' Work' + _S + ' completed - Memo Length : ' + inttostr(length(Memo1.Text)); for i := 0 to Sources.Count - 1 do Memo1.Text := Memo1.Text + #13#10 + (Sources[i]); Sources.Clear; end; procedure TForm1.Button1Click(Sender: TObject); var Tr: HThread; Link: array of string; i: integer; begin Ix := 0; setlength(Link, 3); Button1.Enabled := false; Link[0] := 'http://EngPedia.ir'; Link[1] := 'http://google.com'; Link[2] := 'http://yahoo.com'; for i := 0 to length(Link) - 1 do begin Tr := HThread.Create(true); Tr.FreeOnTerminate := true; Tr.FrmHandle := self.Handle; Tr.Url := Link[i]; Tr.Resume; end; end; procedure TForm1.FormCreate(Sender: TObject); begin Sources := TStringList.Create; end; procedure TForm1.WndProc(var Message: TMessage); begin if Message.Msg = WM_Finished then begin if Message.WParam = 8 then AddToMemo; end; inherited; end; end.
از تابع WndProc برای دریافت پیغام ها ارسال شده توسط Thread ها استفاده میکنیم. در Button1Click سه Thread رو به اجرا در میاریم و Thread ها این اجازه رو دارند که به صورت مدیریت شده به شی Sources دسترسی داشته باشند و اطلاعات مورد نظر رو در آن اضافه کنند. نهایتاً متدی با نام AddToMemo تعریف کردیم تا اطلاعات ذخیره شده در منبع داده اشتراکی (Sources) را در یک کنترل گرافیکی اضافه کند.
مطالب مرتبط
برچسب ها : Main Thread, Message Handler, multi Thread, multiThread, sendMessage, Synchronization, Thread, WndProc, چند نخی, دلفی, نخ, همزمان سازی
دیدگاهتان را بنویسید
نشانی ایمیل منتشر نخواهد شد
تعداد 2 دیدگاه برای نوشته " دسترسی همزمان چند Thread به Main Thread" ارسال شده است .

مطالب جدید
- نرم افزار Bureau Veritas VeriSTAR Homer تحلیل هیدرودینامیک سازه های آبی
- نرم افزار XLRotor تحلیل دینامیکی روتور
- نرم افزار Itasca UDEC مدلسازی تونل، سد و نیروگاههای برق آبی
- نرم افزار WAsP Suite طراحی و تحلیل توربینهای بادی
- نرم افزار Itasca XSite تحلیل عددی شکست هیدرولیکی سه بعدی
- نرم افزار Itasca FLAC3D تحلیل ژئوتکنیک خاک، سنگ و سازه
- نرم افزار Itasca MINEDW تحلیل اجزا محدود جریان آبهای زیرزمینی
- نرم افزار windPRO طراحی نیروگاههای بادی
- نرم افزار Itasca 3DEc v7 تحلیل ژئوتکنیک سنگ و خاک با آموزش فارسی
- نرم افزار SSI ShipConstructor Suite Ultimate طراحی کشتی و کشتیسازی

مطالب پربازدید

مطالب تصادفی
- ماشین اندازه گیری مختصات (CMM)
- دانلود نسخه پرتابل Delphi
- مجموعه نرم افزارهای مهندسی شماره سه
- دانلود کتاب Learning Beginning Android 2
- دانلود پروژه تحلیل کمانش صفحه کامپوزیتی با آباکوس
- نرم افزار Autoship 10.3 طراحی و تحلیل کشتی
- دانلود پروژه شبیه سازی MLPG به زبان Matlab
- دانلود سورس بازی Mine Sweeper به زبان MATLAB
- حل یک مساله تیر (Beam) با روشهای FEM
- تقویت کننده عملیاتی
همکاران ما

گروه مپنا

دانشگاه تهران

سایپا

ایران خودرو

شرکت ملی نفت ایران

ذوبآهن اصفهان

فولاد خوزستان

بسیار عالی .ممنون از اینکه دانسته هاتون رو به اشتراک میگذارید
موفق باشید