PDA

View Full Version : از اساتید محترم خواهشمندم کمک نمائید - Indy و طراحی مسنجر



saniak_robot
چهارشنبه 03 اسفند 1384, 03:48 صبح
با سلام
من با Indy توانستم پیام ارسال نمایم و لیست کاربران آنلاین را هم دریافت نمایم .
اما یک مشکلی که دارم این است که برنامه کلاینت هنگ می کند . یک Antifreez هم روی فرم قرار دادم اما وقتی فرم را drag می کنم برنامه هنگ می کند .
از اساتید خواهش می کنم مرا یاری نمایند.

Touska
چهارشنبه 03 اسفند 1384, 08:52 صبح
شما اگر از Timer استفاده کرده اید بی فایده هست. شما باید از Thread استفاده نمایید نه از Timer.

saniak_robot
چهارشنبه 03 اسفند 1384, 09:39 صبح
بله من از timer استفاده نمودم . ولی چگونه به جای timer از thread استفاده نمایم

saniak_robot
چهارشنبه 03 اسفند 1384, 10:05 صبح
آقای سرباززاده من یک thread رو فرم قرار دادم و کدهایی که در تایمر نوشته بودم را در onrun آن نوشتم مشکلم حل شد .
از راهنمایی شما متشکرم.

Touska
چهارشنبه 03 اسفند 1384, 14:38 عصر
منظور من تعریف thread به این شکل هست :


Type
PClient =^ TClient;
TClient = Record //Object for holding connected user
DNS,Name : String; //Host name and user name
Connected,
LastAction : TDateTime; //Last Connect time and action time
Thread : Pointer; //Hold a pointer of thread's user
End;


به اون کاری که شما کرددی که دیگه thread نمی گن.

Touska
چهارشنبه 03 اسفند 1384, 14:43 عصر
و برای استفاده :


Clients : TThreadList;

و بعد اینجوری تو کانکت می نویسی :


procedure Connecting(UserName,DNS: String; Thread: Pointer);
Var
NewClient : PClient;
begin
New(NewClient);


NewClient.Name := Trim(UserName);
NewClient.DNS := DNS;
NewClient.Connected := StrToDateTime(PrintNormal+' '+TimeToStr(Time));
NewClient.LastAction := NewClient.Connected;
NewClient.Thread := Thread;
//Connect client and add thread
TIdPeerThread(Thread).Data := TObject(NewClient);

End;

و در tcpserverexecute دستورات فرمانی رو کار کن.

Touska
چهارشنبه 03 اسفند 1384, 14:48 عصر
و در client به این شکل کار میکنی :



TClientHandleThread = Class(TThread) //Class Thread
Private
Transfer : TDataTransform;

Procedure HandleInput; //Input of Transfer data

Protected
Procedure Execute; Override; //Excute the client

End;
و نوع تعریفش :


ClientHandleThread : TClientHandleThread; // variable (type see above)
و برای ردگیری :


{ TClientHandleThread }

procedure TClientHandleThread.Execute;
begin
While Not Terminated Do
Begin
IF Not Client.Connected Then
Terminate
Else
Try
Client.ReadBuffer(Transfer, SizeOf (Transfer));
Synchronize(HandleInput);
Except
End;
End;
end;

و برای دستورات :


procedure TClientHandleThread.HandleInput;
Var
Commands : Char;
begin
Commands := Transfer.Command[1];
Case Commands OF
'@' : //Check for password and other
Begin
IF Trim(Transfer.Text) = 'False' Then
Disconnecting(True,False); //job for disconnect
End;
End;

Touska
چهارشنبه 03 اسفند 1384, 14:49 عصر
با این تیکه کدها که فرستادم می تونید یک چیزی مثل Jabber یا Yahoo Messenger بنوسید.

:)

saniak_robot
پنج شنبه 04 اسفند 1384, 13:26 عصر
آقا من و شرمنده خودت کردی.
دستت درد نکنه

parsadsa
یک شنبه 07 خرداد 1385, 20:42 عصر
ba sallam khedmate asatideh mohtaram ,,man tazeh be barname nevisi rooey awordam daram VB kar mikonam mishe lotf befarmaeed ke joori in matno tozih bedin ta manam motavajjeh besham..mamnoon

vcldeveloper
دوشنبه 08 خرداد 1385, 02:32 صبح
...daram VB kar mikonam mishe lotf befarmaeed ke joori in matno tozih bedin...
عزیز جان، اینجا بخش دلفی هست، کدی هم که در بالا نوشته شده کد دلفی هست. شما باید برید به بخش VB.

davoodmz
دوشنبه 08 خرداد 1385, 14:41 عصر
با تشکر از توسکای عزیز
آقای یک زحمت بکشید و اینکه شما که کدها را گذاشتین خود پروژه را بذارید اگر امکان دارد
باتشکر
داود

farshad_momtaz
پنج شنبه 09 شهریور 1385, 14:38 عصر
می شه آقای Touska (http://barnamenevis.org/forum/member.php?u=6323)فایل نوشته شده مسنجر را به صورت اوپس سورس بزارید من تازه با این کامپوننت دلفی آشنا شدم می شه کمکم کنید
farshad_momtaz@yahoo.com