Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.10.16;
Скачать: CL | DM;

Вниз

опять потоки....   Найти похожие ветки 

 
Tommy   (2003-10-03 15:25) [0]

запускаю до 10 раз один и тот же поток...и по4ему-то время распределяется неодинаково на все эти потоки...4то делать?


 
Digitman ©   (2003-10-03 15:28) [1]

привести код конструктора объекта-потока и код поточной ф-ции Execute()


 
Erik   (2003-10-03 15:34) [2]

Сухари сушить. С чего ты взял, что Windows это система реального времени? И почему она должна равномерно распределять время на твои потоки? Пиши VXD и тогда будеш говорить. Или перейди на другию OS желательно сменив железо.


 
Verg ©   (2003-10-03 15:34) [3]


> время распределяется неодинаково на все эти потоки


Да какой степени неодинаково?
В разы? или на доли процента?


 
Tommy   (2003-10-03 15:39) [4]

если на одном произошло 200 обрашении то в другом только 40...


 
Digitman ©   (2003-10-03 15:46) [5]

что есть "обрашении" ?
ты код приведешь наконец-то или нет ?


 
Tommy   (2003-10-03 15:50) [6]

type
TDbServerThread = class(TServerClientThread)
private
ID: Integer;
strCommand: string;
strFeedback: string;

public
procedure ClientExecute; override;
procedure Log;
procedure LogFeedback;
procedure AddRecord;
end;

{$R *.DFM}

procedure TForm1.FormCreate(Sender: TObject);
begin
InitializeCriticalSection(CS);
end;

{ TDbServerThread }

procedure TDbServerThread.Log;
begin
Form1.lbLog.Items.Add ("Request: " + strCommand);
end;

procedure TDbServerThread.LogFeedback;
begin
Form1.lbLog.Items.Add ("Response: " + strFeedback);
end;

procedure TDbServerThread.AddRecord;
begin
with form1 do
begin

ADOQuery1.Active:=true;
ADOQuery1.Append;
ADOQuery1.Edit;

ADOQuery1["ICardNum"]:= "0000";
ADOQuery1["ICarNum"]:= Copy(strCommand,51,length(strCommand)-50);
ADOQuery1["IStatus"]:= "1";
ADOQuery1["IGroup"]:= "00";
ADOQuery1["IMType"]:= "0";
ADOQuery1["IFirstTime"]:= Now;
ADOQuery1["ILastTime"]:= Now;
ADOQuery1["IPay"]:= "0";
ADOQuery1["IReceipt"]:= "0000000";
ADOQuery1["ITicketNo"]:= "00000";
ADOQuery1.Post;
ADOQuery1.Active:=false;


end;
end;

procedure TDbServerThread.ClientExecute;
var
Stream: TWinSocketStream;
Buffer, strIn: string;
nRead: Integer;
begin

ID :=0;
FreeOnterminate:=True;

CoInitialize(nil);

Stream := TWinSocketStream.Create(ClientSocket, 5000);
try
while not Terminated and ClientSocket.Connected do
begin
Buffer := "";
strIn := "";
SetLength(Buffer, 64);
repeat
nRead := Stream.Read(Buffer[1], 64);
if nRead = 0 then
begin
ClientSocket.Close;
Break;
end;
SetLength (Buffer, nRead);
StrIn := StrIn + Buffer;
until (Pos(#10#13"."#10#13, Buffer) > 0);

if strIn = "" then
Continue // keep going
else
begin
// handle the request, if anything arrived
StrCommand := Copy (strIn, 1, Pos (#10#13"."#10#13, strIn) -1);
EnterCriticalSection(CS);
AddRecord;
LeaveCriticalSection(CS);
Synchronize(Log);
// send results back
Inc(ID);

// get the value to return
strFeedback := inttostr(ID);
//Synchronize(LogFeedback);
Stream.Write(strFeedback[1], Length (strFeedback));
end;
end;
finally

Stream.Free;
CoUninitialize;
end;
end;

procedure TForm1.ServerSocket1GetThread(Sender: TObject;
ClientSocket: TServerClientWinSocket;
var SocketThread: TServerClientThread);
begin

lbLog.Items.Add ("GetThread: " +
ClientSocket.RemoteHost + " (" + ClientSocket.RemoteAddress + ")" );
SocketThread := TDbServerThread.Create(False, ClientSocket);

end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
DeleteCriticalSection(CS);
end;

end.


 
Digitman ©   (2003-10-03 16:03) [7]

так ... и что ? что здесь подразумевается под "обращением" ?


 
Verg ©   (2003-10-03 16:07) [8]

По ходу текста

1-ое:


> StrIn := StrIn + Buffer;
> until (Pos(#10#13"."#10#13, {Buffer} StrIn) > 0);


 
Verg ©   (2003-10-03 16:16) [9]


> ADOQuery1["ICarNum"]:= Copy(strCommand,51,length(strCommand)-50);


Это я вообще не понял - это что за 50 и 51? "Magic numbers"?


 
Tommy   (2003-10-03 16:18) [10]

"обращение" :) - это запись в базу данных


 
Tommy   (2003-10-03 16:22) [11]

>>Verg
да это мое там...не играет решающего значеня...потому 4то клиент всегда шлет больше 70 символов


 
Digitman ©   (2003-10-03 16:26) [12]


> Tommy


так ведь интенсивность обращений к базе напрямую у тебя зависит от интенсивности запросов клиента)

один клиент - лентяй, он делает запрос, скажем, раз в секунду
а другой - шустрый как электровеник, умудряется косой десяток запросов сделать за ту же секунду

что же ты хочешь ? насколько активен клиент, на столько интенсивна и работа сервера для данного соединения


 
Verg ©   (2003-10-03 16:28) [13]

Да вообще тут:

> repeat
> nRead := Stream.Read(Buffer[1], 64);
> if nRead = 0 then
> begin
> ClientSocket.Close;
> Break;
> end;
> SetLength (Buffer, nRead);
// Ну и? сделали Buffer длиной nRead (<=64) и пошли к началу цикла, где Stream.Read(Buffer[1], 64);
//Так и до AV недалеко

> StrIn := StrIn + Buffer;
> until (Pos(#10#13"."#10#13, Buffer) > 0);


 
Verg ©   (2003-10-03 16:30) [14]


> Buffer := "";
> strIn := "";
> SetLength(Buffer, 64);
> repeat
> nRead := Stream.Read(Buffer[1], length(Buffer));
> if nRead = 0 then
> begin
> ClientSocket.Close;
> exit;
> end;
> StrIn := StrIn + copy(buffer, 1, nread);
> until (Pos(#10#13"."#10#13, StrIn) > 0);


 
Tommy   (2003-10-03 16:51) [15]

видимо так оно и есть...только пока нету больше двух компов вот потому и такая история...спасибо вам!!!


 
Владислав ©   (2003-10-03 16:57) [16]

Странный код...


 
Verg ©   (2003-10-03 17:00) [17]


> Владислав © (03.10.03 16:57) [16]
> Странный код...


Да какой уж есть...

Сказано же:


> только пока нету больше двух компов вот потому и такая история



Страницы: 1 вся ветка

Текущий архив: 2003.10.16;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.019 c
3-51064
Weare
2003-09-26 12:16
2003.10.16
Печать из грида


14-51475
Anonim
2003-09-29 13:31
2003.10.16
Есть комментарии????


14-51461
Igorek
2003-09-27 23:59
2003.10.16
Дежурство в чате


14-51437
Некрофил-затейник__
2003-09-30 07:30
2003.10.16
HELP!!!!!


3-51126
Scorpio3k
2003-09-24 14:05
2003.10.16
Базы Данных - Как не сохранять изменения?