PDA

View Full Version : ایجاد و استفاده از thread در برنامه



omidan321
شنبه 25 آبان 1392, 10:36 صبح
سلام به همگی
تاپیک های مربوط به ترد رو خوندم مشکلاتم رو مینویسم تا بتونم از ترد در برنامه هام استفاده کنم :
1. تعریف ترد در برنامه به شکل زیر درست هست ؟

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

methread=class(TThread)
private
procedure th;
end;


این تعریف ازم این ایراد رو میگیره : Unsatisfied forward or external declaration: 'thr.th'
2. مورد بعدی این تعریف هست که کجا باید تعریف بشه این کدها:

var
T : MyThread;
begin
T := MyThread.Create(True);
T.FreeOnTerminate := True;
T.Resume;
end;



فعلا برای شروعه ، با کمک دوستان میخام ادامه بدم .

omidan321
شنبه 25 آبان 1392, 18:21 عصر
از یه سایتی یه مطلبی گرفتم که کار من منو راه انداخت
کدهاش به صورت زیره :


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type

mit = class(TThread)
private
i: Byte;
protected
procedure execute; override;
procedure dosomething;
procedure DoVisual;
public
constructor Create;
end;

TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);

private
{ Private declarations }
MyThread: mit;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.dfm}

//// ************************************************** *******

constructor mit.Create;
begin
inherited Create(False);
end;

//// ************************************************** *******

procedure mit.DoVisual;
begin
Form1.label4.Caption := converti ;
end;
//// ************************************************** *******

procedure mit.execute;
begin
dosomething;
end;

//// ************************************************** *******

procedure mit.dosomething;
var
count: Byte;
str_com,dtr,converti:string;
begin
form1.ComPort1.Read(str_com,count);
Synchronize(dovisual);
dtr :=dtr + str_com ;
converti :=StringtoHex(dtr);
Synchronize(dovisual);
form1.Edit7.Text :=converti ;
end;
//// ************************************************** *******



procedure TForm1.Button1Click(Sender: TObject);
begin
MyThread := mit.Create;
end;

//// ************************************************** *******

procedure TForm1.Button2Click(Sender: TObject);
begin
Mythread.Terminate;
end;

//// ************************************************** *******

procedure TForm1.Button3Click(Sender: TObject);
begin
Mythread.Suspend;
end;

//// ************************************************** *******

procedure TForm1.Button4Click(Sender: TObject);
begin
Mythread.Resume;
end;


end.




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


کسی هست بتونه کمکم کنه ؟

Mask
شنبه 25 آبان 1392, 20:06 عصر
این تعریف ازم این ایراد رو میگیره : Unsatisfied forward or external declaration: 'thr.th'
این به این خاطره که بعد از تعریف اعلان باید دکمه Ctrl+Shift+C رو بزنید تا پروسیجرهای مربوطه ساخته بشه.

2. مورد بعدی این تعریف هست که کجا باید تعریف بشه این کدها:
این کدها میتونه تو یه دکمه باشه.
این کدها برای شما ترد مذکور رو ایجاد میکنه و بنا به نیاز هر جا خواستید میتونید استفاده کنید.

omidan321
شنبه 25 آبان 1392, 22:19 عصر
دوست عزیز سپاس
این پست دومم انتهاش یه سوال کردم که اون برام مسئله شده .
ممنون میشم به اون پاسخ بدید .

omidan321
دوشنبه 27 آبان 1392, 12:33 عصر
این کد مربوط به ترد رو از نت گرفتم و تو قسمت dosomthing کد های خودمو گذاشتم .
قبل از اینکه کد های مربوط به خودمو جایگزین کنم برنامه درست کار میکرد . اما وقتی کد های خودمو گذاشتم برنامم هنگ میکنه .
کجاش اشتباه نمیدونم (به نظرم روال ساخت ترد مشکلی نداره ، مشکل از کدهایی هست که گذاشتم و یا بخش همسان سازی ترد ، کدومشه نمیدونم )

loo30fer
دوشنبه 27 آبان 1392, 13:08 عصر
این دوتا کدتون یعنی ارتباط مستقیم بافرم در Thread که همین عوامل باعث فریز شدن و مشکلات مختلفی داخل برنامه میشه
form1.ComPort1.Read(str_com,count);
form1.Edit7.Text :=converti ;
و موقعی که بدین شکل form1.ComPort1.Read سعی در خواندن اطلاعات از پورت Com میکنید چون شی Comport شما در کلاس TForm شما قرار داره خوب بایدم این فریز شدن اتفاق بیفته چون کلاس TForm شما اقدام به اجرا کردن دستور شما میکنه و این کلاسی که از TThread مشتق کردین کلا بی فایده میمونه.
برای حل این مشکل شی ComPort رو در حالت RunTime داخل Thread ایجاد کنید و داخل execute اقدام به خواندن اطلاعات کنید و مقدار رویدادها یا مقادیر رو توسط SendMessage به برنامتون ارسال کنید و یک MessageHandler برای برنامتون بنویسید و که پیغام ها رو دریافت کنه و ارتباط با فرم رو انجام بده.
در ضمن این کدهایی که کپی میکنید میتونه کد یکی از کاربران اون سایت باشه که کدش مشکل داشته و برای مشاهده توسط اساتید و پیدا کردن مشکل قرار داده باشه.
در کل بهتره بیشتر با دلفی آشنا بشین چون اینطوری کار خودتون رو خیلی سخت میکنید و برای هر کد به مشکل برمیخورید و متوجه کدها نمیشین.

omidan321
سه شنبه 28 آبان 1392, 07:40 صبح
برای حل این مشکل شی ComPort رو در حالت RunTime داخل Thread ایجاد کنید
اگه منظورت از حالت runtime اینه که به صورت مستقیم عملیات فراخوانی انجام بشه ، تنها راهی که میشد ز پورت اطلاعات رو بخونی همین راهه همه راهها رو امتحان کردم ج نداد (اگه منظورتون چیزه دیگه ای غیر از این راهه ممنون میشم ما رو در جریان قرار بدید)


داخل execute اقدام به خواندن اطلاعات کنید و مقدار رویدادها یا مقادیر رو توسط SendMessage به برنامتون ارسال کنید و یک MessageHandler برای برنامتون بنویسید و که پیغام ها رو دریافت کنه و ارتباط با فرم رو انجام بده.
با این موضوع مشکل دارم نمیتونم پیاده سازی کنم ممنون میشم بیشتر راهنماییم کنی

omidan321
دوشنبه 04 آذر 1392, 08:23 صبح
کسی نیس جواب این دو تا سوال منو بده ؟؟؟؟؟؟؟؟؟؟؟؟؟

omidan321
پنج شنبه 14 آذر 1392, 13:29 عصر
کارم گیره کسی نی منو کمک کنه
یا یه نمونه کد از thread بزاره تا خودم اینکارو بکنم

hadisalahi2
پنج شنبه 14 آذر 1392, 16:47 عصر
عزیزم ، برو تو قسمت کنفرانسهای ویدئویی
یک پست هست که داخلش فیلم آموزشی آقای عباسی در مورد تردها هستش
اون کاملا روش انجام رو هت توضیح میده
یا علی