PDA

View Full Version : ایجاد صف



seyed_farid
سه شنبه 22 بهمن 1392, 00:07 صبح
با سلام
من یک فانکشن تو برنامم دارم که با اون ارسال متن در شبکه به کامپیوتر مشخصی میکنم و این فانکشن در جاهای مختلف برنامه صدا زده و اجرا میشه. در بعضی مواقع پیامها به مقصد نمیرسه که احتمال میدم بخاطر ازبین رفتن ارسالها باشه بدلیل تداخل. حالا میخوام یک صف درست کنم و دستورات رو تو اون صف بریزم و پشت سرهم کار ارسال انجام بشه.
میتونید راهنماییم کنید؟
ممنون

Mask
سه شنبه 22 بهمن 1392, 01:05 صبح
کامل توضیح بدید :
از چه پروتکلی برای ارسال استفاده میکنید؟
عملیات ارسال در ترد جدا پیاده شده یا در مین ترد؟
در استفاده از صف مشکلی نیست و پیاده سازی راحتی داره و میتونید از TList استفاده کنید.

seyed_farid
سه شنبه 22 بهمن 1392, 11:24 صبح
با سلام و تشكر
من با استفاده از كومپوننت mwIdTCPThreadClient ارسال انجام ميدهم و با دستور زير:

if (mwIdTCPThreadClient1.Connected)
then
mwIdTCPThreadClient1.Write(MessageToSend + #0);

Mask
سه شنبه 22 بهمن 1392, 12:24 عصر
در نمونه زیر یه صف بندی رو پیاده سازی کردم :
میتونید از این آموزش ایده بگیرید و در برنامتون نسبت به نیازتون پیاده سازی کنید:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ADODB, DB, Grids, DBGrids, IdContext,
IdBaseComponent, IdComponent, IdCustomTCPServer, IdTCPServer, IdTCPConnection,
IdTCPClient;

type
TForm1 = class(TForm)
IdTCPServer1: TIdTCPServer;
Mem_Send: TMemo;
Button1: TButton;
IdTCPClient1: TIdTCPClient;
Edit1: TEdit;
Mem_result: TMemo;
procedure IdTCPServer1Execute(AContext: TIdContext);
procedure Mem_SendChange(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure Edit1Change(Sender: TObject);
private
Procedure WndProc(var Message: TMessage); Override;
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
StateList: Boolean;
WM_Msg_Client: DWORD;

implementation

{$R *.dfm}

procedure AddList(S: string);
begin
Form1.Mem_Send.Lines.Append(S);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
with IdTCPClient1 do
begin
Host := '127.0.0.1';
Port := 1020;
Connect;
IOHandler.WriteLn(Edit1.Text);
Disconnect;
end;
end;

procedure TForm1.Edit1Change(Sender: TObject);
begin
if Edit1.Text = '' then
Edit1.Text := '0';
end;

procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
begin
AddList(AContext.Connection.IOHandler.ReadLn());
end;

procedure TForm1.Mem_SendChange(Sender: TObject);
begin
if not StateList then
begin
StateList := True;
SendMessage(Form1.Handle, WM_Msg_Client, Integer(Mem_Send.Lines[0]), 0);
end;
end;

procedure TForm1.WndProc(var Message: TMessage);
var
RecText: string;
Counter: Byte;
i: Integer;
begin
if Message.Msg = WM_Msg_Client then
begin
RecText := String(Message.WParam);
if RecText <> '' then
begin
Counter := StrToInt(RecText);
case Counter of
1:
begin
Mem_result.Clear;
for i := 1 to 1000 do
begin
Mem_result.Lines.Append('1-' + IntToStr(i));
Sleep(10);
Application.ProcessMessages;
end;
end;
2:
begin
Mem_result.Clear;
for i := 1 to 1000 do
begin
Mem_result.Lines.Append('2-' + IntToStr(i));
Sleep(10);
Application.ProcessMessages;
end;
end;
end;
end;
StateList := False;
if Mem_Send.Lines.Count <> 0 then
Mem_Send.Lines.Delete(0);
end;
inherited;
end;

end.

seyed_farid
چهارشنبه 23 بهمن 1392, 22:49 عصر
ممنون از راهنمائیتون. چک میکنم.

seyed_farid
چهارشنبه 23 بهمن 1392, 23:06 عصر
دو سوال:
1- به جای procedure TForm1.WndProc(var Message: TMessage); نمیشه از یک فانکشن استفاده کرد؟ اگه یک فانکشن در حینی که داره کار میکنه از جای دیگه صدا زده شه و با پارامترهای دیگه ای صدا زده شه تکلیف پروسه قبلی که در وسط کاره و پارامترهاش فرق میکنه چی میشه؟ مشکلی پیش نمیآد؟

2- اگه پیامی که میخوام بفرستم مثلا چندخط باشه و من باید اونها رو باهم بفرستم تکلیف چی میشه؟

Mask
پنج شنبه 24 بهمن 1392, 00:01 صبح
1- به جای procedure TForm1.WndProc(var Message: TMessage); نمیشه از یک فانکشن استفاده کرد؟
علت استفاده از wndproc اینه که عملیات مدیریت پیغامها رو خوده ویندوز به عهده بگیره . اگه قرار باشه از Function استفاده کنید باید حتما از CriticalSection استفاده کنید.

اگه یک فانکشن در حینی که داره کار میکنه از جای دیگه صدا زده شه و با پارامترهای دیگه ای صدا زده شه تکلیف پروسه قبلی که در وسط کاره و پارامترهاش فرق میکنه چی میشه؟ مشکلی پیش نمیآد؟
علت استفاده از CriticalSection همینه.

2- اگه پیامی که میخوام بفرستم مثلا چندخط باشه و من باید اونها رو باهم بفرستم تکلیف چی میشه؟
منظورتون از تکلیف چی میشه چیه؟

seyed_farid
پنج شنبه 24 بهمن 1392, 01:25 صبح
منظورتون از تکلیف چی میشه چیه؟

در سورس شما خط خط در آخر پاک میشه ولی من میخوام قطعه قطعه کار انجام بشه چون شاید یه متن خودش شامل چندخط باشه و من کل اون متن رو بخوام پروسس کنم.

Felony
پنج شنبه 24 بهمن 1392, 08:42 صبح
اگر از نسخه 2010 به بعد استفاده میکنید ، پیاده سازی Queue به صورت Generic در دلفی موجود هست ، مثلا :


var
Queue: TQueue<string>;
begin
Queue := TQueue<string>.Create;
try
Queue.Enqueue('Sample string 1');
Queue.Enqueue('Sample string 2');
Queue.Enqueue('Sample string 3');
Queue.Enqueue('Sample string 4');
Queue.Enqueue('Sample string 5');

while (Queue.Count <> 0) do
ShowMessage(Queue.Dequeue);
finally
Queue.Free;
end;
end;

seyed_farid
پنج شنبه 24 بهمن 1392, 18:38 عصر
ممنون از راهنمائيتون.
ولي من از دلفي7 استفاده ميكنم. چه راهي داره؟
يونيتي براي اين مورد هست كه با 7 كار كنه؟

seyed_farid
دوشنبه 15 دی 1393, 15:48 عصر
با تشکر از دوستان گرامی که راهنمایی کردند.
من با استفاده از صف کار رو انجام دادم که کدهاش رو میگذارم.
البته باید این کدها با استفاده از ترد انجام بشه که در پروسس اصلی وقفه ایجاد نکنه.
اگر دوستان کمک کنند و این کار رو با ترد کدینگ کنند تا کامل بشه.