PDA

View Full Version : حرفه ای: دانلود همزمان در قالب یک Thread



loo30fer
سه شنبه 21 آبان 1392, 18:45 عصر
سلام دوستان
راستش میخوام چندین عملیات دانلود رو همزمان در قالب یک Thread پیاده کنم ولی مشکلی اینجاست که وقتی اولین شی IdHTTP رو ایجاد و درخواست دانلود رو در Execute ارسال میکنم اون Thread تا اتمام دانلود منتظر میمونه البته میدونم این اتفاق طبیعیه ولی آیا راهی برای فرار از این انتظار و رفتن سراغ درخواست بعدی وجود داره ؟
تو انجمن جستجو کردم ولی به نتیجه ای نرسیدم ممنون میشم راهنمایی کنید . با تشکر

Mask
سه شنبه 21 آبان 1392, 20:28 عصر
علت اینکه در چندین ترد پیاده سازی نمیکنید چیه؟

loo30fer
چهارشنبه 22 آبان 1392, 16:24 عصر
چون برای هردانلود 8 دریافت در نظر گرفتم و اگه کاربر بخواد 6 فایل رو همزمان دانلود کنه خوب تعداد Thread هایی که براش ساخته میشه 48 تا هست که به نظرم اصلا جالب نیست.

loo30fer
چهارشنبه 22 آبان 1392, 17:27 عصر
راستش چیزی که به ذهنم رسید ارسال مستقیم پیغام به Thread بود ولی کدی که بدین شکل نوشتم اصلا کار نمیکنه :
unit Unit1;

interface

uses
Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

const
WM_TEST_MESSAGE = WM_USER + 700;

type
TTestThread = class (TThread)
procedure Execute; Override;
procedure MsqEventThread(var Message: TMessage); message WM_TEST_MESSAGE;
end;

var
Form1: TForm1;
Th : TTestThread;

implementation

{$R *.dfm}

procedure TTestThread.MsqEventThread(var Message: TMessage);
begin
MessageBeep(0);
end;

Procedure TTestThread .Execute;
begin
while (not Terminated) do
begin
Sleep(2000);
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
Th:= TTestThread.Create(false);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
PostThreadMessage(Th.ThreadId, WM_TEST_MESSAGE, 0, 0);
end;

end.


لازم به ذکره که بگم نمیخوام بدین شکل عمل کنم چون باز مشکل همچون برقراره میشه :
Procedure TTestThread.Execute;
var
msg : TMsg;
begin
case msg.message of
WM_TEST_MESSAGE : //// Call My procedure;
else
Dispatch(Msg);
end;
end;

Felony
پنج شنبه 23 آبان 1392, 14:06 عصر
راستش چیزی که به ذهنم رسید ارسال مستقیم پیغام به Thread بود ولی کدی که بدین شکل نوشتم اصلا کار نمیکنه :
نبایدم کار کنه ! Message Queue اون ترد کجا بود که به پیغام شما رسیدگی کنه ؟!

وقتی از نحوه کار یک تابع و ملزوماتش اطلاع ندارید مستنداتش رو مطالعه کنید و فقط بر ندارید به پارامترهاش مقدار بدید و منتظر نتیجه باشید ! حداقل مقدار بازگشتی تابع PostThreadMessage رو بررسی میکردید ببینید درست کار میکنه یا نه !

قسمت Remarks رو مطالعه کنید : http://msdn.microsoft.com/en-us/library/windows/desktop/ms644946(v=vs.85).aspx

loo30fer
پنج شنبه 23 آبان 1392, 17:27 عصر
نبایدم کار کنه ! Message Queue اون ترد کجا بود که به پیغام شما رسیدگی کنه ؟!

وقتی از نحوه کار یک تابع و ملزوماتش اطلاع ندارید مستنداتش رو مطالعه کنید و فقط بر ندارید به پارامترهاش مقدار بدید و منتظر نتیجه باشید ! حداقل مقدار بازگشتی تابع PostThreadMessage رو بررسی میکردید ببینید درست کار میکنه یا نه !

قسمت Remarks رو مطالعه کنید : ممنون بابت راهنماییتون , همه نکاتی که در Remarks مطرح شده بود رو رعایت کردم و مشکل در دریافت پیغام ها حل شد ولی همچنان Thread فقط به یک عملیات در Execute میتونه رسیدگی کنه که در آخر مجبورم برای هر دانلود یک Thread ایجاد کنم.
در مورد PostThreadMessage هم داخل کلاسی که نوشته بودم نتیجه رو بررسی میکردم و نتیجه درست بود ولی توسط MsqEventThread پیغام دریافت نمیشد که مشکل رو گوش زد کردین , در کل چون نمیخواستم کد کلاس خودم رو قرار بدم مجبور به باز نویسی یک کلاس برای نمایش کار شدم که فراموشم شد بعضی نکات رو رعایت کنم بهرحال ممنون بابت توجهتون