Форум: "Основная";
Текущий архив: 2003.10.16;
Скачать: [xml.tar.bz2];
Внизопять потоки.... Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.053 c