دسترسی همزمان چند Thread به Main Thread
- ◷ 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, چند نخی, دلفی, نخ, همزمان سازی
دیدگاهتان را بنویسید
نشانی ایمیل منتشر نخواهد شد

مطالب جدید
- DeltaV Mimic v6 اعتبارسنجی و شبیهسازی نیروگاههای صنعتی
- SIMULIA IVCAD Suite 2026 شبیهسازی و اندازهگیری سیستمهای RF
- TaniqWind Pro 1.14 تولید مخازن کامپوزیتی به روش فیلامنت وایندینگ
- DukeSim v1.2 شبیهساز پیشرفته تصویربرداری و دوزسنجی CT
- Kinetix Matrix 3.01 طراحی و بهینهسازی اسیدکاری چاه نفت و گاز
- DNV WindFarmer 1.7.1 طراحی و بهینهسازی نیروگاههای بادی
- NetSim Pro 15.1 پلتفرم پیشرفته طراحی و تحلیل شبکههای مخابراتی
- Gamry Echem Analyst 2 تحلیل خوردگی و آزمونهای الکتروشیمیایی
- XGtd 3.1.2 شبیهسازی سامانههای راداری و آنتن
- Simcenter Multimech 2506 تحلیل ریزساختار و رفتار مکانیکی مواد پیشرفته

مطالب پربازدید
- پکیج کامل استانداردهای صنعتی
- دانلود کتاب هیدرولیک و پنوماتیک فستو Festo فارسی
- دانلود فول استاندارد ASTM بصورت رایگان
- کلید فولاد (Key to Steel) پرتابل
- آموزش میکروکنترلر AVR
- دانلود آنتی ویروس شورتکات (Back 2 Normal)
- دانلود جدول استاندارد DIN
- دانلود کتاب آموزش Abaqus (فارسی)
- فول استاندارد ASME (بروز)
- دانلود نرم افزار MATLAB برای آندروید(MATLAB Android)

مطالب تصادفی
- HampsonRussell 2026.2 تفسیر لرزه ای برای اکتشاف میادین نفت و گاز
- MEPLA Pro 2025.6 تحلیل دقیق سازههای شیشهای
- نرم افزار شبیه سازی جوش Simufact Welding
- پکیج آموزشی اسکریپتنویسی در Abaqus
- Tdyn CFD 17 تحلیل چندفیزیکی جریان و حرارت
- CoventorWare طراحی سیستمهای میکروالکترومکانیکی MEMS
- نرم افزار شبیه سازی عملیات حفاری Drillbench 2022
- مجموعه ای ناب از کتابهای اجزا محدود (FEM)
- QForm 3D شکل دهی فلزات
- EBSILON Professional 18 شبیهسازی نیروگاه حرارتی







