Люди добрые помогите плиз, уже 2 недели ищу косяк в проге, дело в TCPClient? Сначало тупо бесконечный цикл с ошибкой ломала(выставляло true в False), теперь вообще непонятно что делает, при запуске потока всё работает как надо, работает тока не долго(когда 100 циклов, когда 10000) потом притормаживает(как-будто клиент не отвечает) затем срывается и тупо нечего не отсылает и не принимает(а циклы крутит как будто ответ уже пришол, т.е. за секунду несколько тысяч пробигает....[more=Исходник на делфи7 тут]
unit KRRead;
interface
uses
Classes, SysUtils, Sockets, ExtCtrls, Windows, Messages, Variants, Graphics, Controls, Forms,
Dialogs;
type
Work = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;
Type
Buf = array [0..511] of byte;
PBuf = ^Buf;
function crc8 (Start, UsDataLen: integer; Mes: array of byte): byte;
var
Client1: TTCPClient;
InputARMData: buf;
KRData: buf;
KRDataQueryByf: Buf;
buffer: buf;
KRReadWrite, Rezerv: Boolean;
implementation
uses SKRSeting, SKR, ARMIO, SKRServer, SKRWork, data;
{ Important: Methods and properties of objects in visual components can only be
used in a method called using Synchronize, for example,
Synchronize(UpdateCaption);
and UpdateCaption could look like,
procedure Work.UpdateCaption;
begin
Form1.Caption := 'Updated in a thread';
end; }
{ Work }
procedure Work.Execute;
var
KolParNastr14DOst, KolParNastr14AOst, KolParNastr14A, KolParNastrA, k, j: integer;
KR, Param, i, ii, LenSav, LenRec, KolParNastrD, KolParNastr14D: Integer;
A: Byte;
ELOKR, L, M, N, P, KolOKR4, KolOKR4Ost, TimeOut: Integer;
S: boolean;
begin
KR:=SKR.KRNum;
data.Potok.KRWork[KR]:=true;
KRReadWrite:=True; //''1''
Client1:=TTcpClient.Create(Nil);
If data.Potok.KRRezerv[KR] then begin
Client1.RemoteHost:=SKRSeting.KRSet.KR[KR].RezIP;
Client1.RemotePort:=SKRSeting.KRSet.KR[KR].RezPort;
TimeOut:=StrToInt(SKRSeting.KRSet.KR[KR].RezTimeOut);
end else begin
Client1.RemoteHost:=SKRSeting.KRSet.KR[KR].IP;
Client1.RemotePort:=SKRSeting.KRSet.KR[KR].Port;
TimeOut:=StrToInt(SKRSeting.KRSet.KR[KR].TimeOut);
end;
Client1.Active:=True;
While KRReadWrite do
begin
KRDataQueryByf[$00]:=KR;
KRDataQueryByf[$01]:=$00;
KRDataQueryByf[$04]:=$40;
KRDataQueryByf[$05]:=$01;
KRDataQueryByf[$06]:=$00; // Чтение ИНР
for Param:=0 to strtoint(SKRseting.KRSet.KR[KR].INRKol)-1 do begin //поочерёдно читаем все ИНР //''3''
KRDataQueryByf[$07]:=Param;
KRDataQueryByf[$02]:=$03; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$08]:=crc8(0,8,KRDataQueryByf); //Считаем CRC
LenSav:=8+4*strtoint(SKRseting.KRSet.KR[KR].INR[Param+1]); //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.SendBuf(KRDataQueryByf[$00], 9); //Отправляем данные
While Client1.WaitForData(TimeOut) do //Теперь ждём данных
begin
ii:=Client1.ReceiveBuf(buffer[i],lenSav); //получаем данные
if ii>0 then i:=i+ii; //''4''
If LenRec=i then break;
end; //''-4''
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC //''4''
begin
If (buffer[4] and $02)=1 then Rezerv:=true;
for i:=0 to 4*strtoint(SKRSeting.KRSet.KR[KR].INR[Param+1]) do
Begin //''5''
A:=Buffer[i+7];
Data.KRData[KR].INR[Param].INRIO[i]:=A; //''-5''
end; //''-4''
end; //''-3''
end;//Закончили читать ИНР
// Чтение Параметров настройки
//********************
KolParNastrA:=strtoint(SKRseting.KRSet.KR[KR].AIKol);
k:=0;
If KolParNastrA>0 then //Читаем AI
begin //''3''
KolParNastr14A:=KolParNastrA div 14;
KolParNastr14AOst:=KolParNastrA mod 14;
KRDataQueryByf[$06]:=$01;
for Param:=1 to KolParNastr14A do begin //поочерёдно читаем параметры пакетами по 14 штук //''4''
KRDataQueryByf[$07]:=$0E;
KRDataQueryByf[$02]:=$2D; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
for j:=1 to 14 do
begin //''5''
KRDataQueryByf[j*3+5]:=(strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,1]) and $FF); //начало номера алгоблока
KRDataQueryByf[j*3+6]:=(strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,1]) shr 8); //конец номера алгоблока
KRDataQueryByf[j*3+7]:=strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,2]); //номер входа алгоблока
end; //''-5''
KRDataQueryByf[$32]:=crc8(0,49,KRDataQueryByf); //Считаем CRC
LenSav:=$79; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.SendBuf(KRDataQueryByf[$00], $33); //Отправляем данные
While Client1.WaitForData(TimeOut) do //Теперь ждём данных
begin //''5''
ii:=Client1.ReceiveBuf(buffer[i],lenSav); //получаем данные
if ii>0 then i:=i+ii;
If LenRec=i then break;
end; //''-5''
i:=CRC8 (0,$78,buffer); //Считаем CRC
If buffer[$78]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true; //''5''
for i:=0 to 111 do
Begin //''6''
A:=Buffer[i+8];
Data.KRData[KR].AI[i+k*112]:=A;
end; //''-6''
end;
end; //''-4''
end; //Закончили читать ПАкеты AI
//*****************
If KolParNastr14Aost>0 then
begin //''4''
KRDataQueryByf[$07]:=KolParNastr14Aost;
KRDataQueryByf[$02]:=KolParNastr14Aost*3+3; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$06]:=$01;
for j:=1 to KolParNastr14Aost do
begin //''5''
KRDataQueryByf[j*3+5]:=(strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,1]) and $FF); //начало номера алгоблока
KRDataQueryByf[j*3+6]:=(strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,1]) shr 8); //конец номера алгоблока
KRDataQueryByf[j*3+7]:=strtoint(SKRseting.KRSet.KR[KR].AI[14*k+j,2]); //номер входа алгоблока
end; //''-5''
KRDataQueryByf[KolParNastr14Aost*3+8]:=crc8(0,KolParNastr14Aost*3+8,KRDataQueryByf); //Считаем CRC
LenSav:=KolParNastr14Aost*8+9; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.SendBuf(KRDataQueryByf[$00], KolParNastr14Aost*3+9); //Отправляем данные
While Client1.WaitForData(TimeOut) do //Теперь ждём данных
begin //''5''
ii:=Client1.ReceiveBuf(buffer[i],lenSav); //получаем данные
if ii>0 then i:=i+ii;
If LenRec=i then break;
end; //''-5''
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin //''5''
for i:=0 to KolParNastr14Aost*8 do
Begin
If (buffer[4] and $02)=1 then Rezerv:=true; //''6''
A:=Buffer[i+8];
Data.KRData[KR].AI[i+k*112]:=A;
end; //''-6''
end ;
end; //Закончили читать остатки AI
If StrToInt(SKRSeting.KRSet.KR[KR].OKRKol)>0 then
begin
L:=1;
M:=0;
KolOKR4:=StrToInt(SKRSeting.KRSet.KR[KR].OKRKol) div 4;
KolOKR4Ost:=StrToInt(SKRSeting.KRSet.KR[KR].OKRKol) mod 4;
For ELOKR:=1 to KolOKR4 do
begin
KRDataQueryByf[$02]:=$07; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$05]:=$01;
KRDataQueryByf[$06]:=$02;
KRDataQueryByf[$07]:=$04;
KRDataQueryByf[$08]:=L;
KRDataQueryByf[$09]:=L+1;
KRDataQueryByf[$0A]:=L+2;
KRDataQueryByf[$0B]:=L+3;
L:=L+4;
KRDataQueryByf[$0C]:=crc8(0,$0C,KRDataQueryByf);
LenSav:=$65; //Считаем сколько должно придти
LenRec:=LenSav; //Сохраняем резервную копию(чтоб второй раз не считать)
i:=0;
Client1.SendBuf(KRDataQueryByf[$00], $0D); //Отправляем данные
While Client1.WaitForData(TimeOut) do //Теперь ждём данных
begin //''5''
ii:=Client1.ReceiveBuf(buffer[i],lenSav); //получаем данные
if ii>0 then i:=i+ii;
If i=LenRec then break;
end; //''-5''
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true; //''5''
for i:=0 to 23*4-1 do
Begin //''6''
A:=Buffer[i+8];
Data.KRData[KR].OKR[i+M*$5c]:=A;
end;
M:=M+1; //''-6''
end;
End;
If KolOKR4Ost>0 then
begin
KRDataQueryByf[$02]:=KolOKR4Ost+3; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$05]:=$01;
KRDataQueryByf[$06]:=$02;
KRDataQueryByf[$07]:=KolOKR4Ost;
For i:=0 to KolOKR4Ost do
begin
KRDataQueryByf[i+8]:=L+i;
end;
KRDataQueryByf[KolOKR4Ost+8]:=crc8(0,KolOKR4Ost+8,KRDataQueryByf);
LenSav:=23*KolOKR4Ost+9; //Считаем сколько должно придти
LenRec:=LenSav; //Сохраняем резервную копию(чтоб второй раз не считать)
i:=0;
Client1.SendBuf(KRDataQueryByf[$00], KolOKR4Ost+9); //Отправляем данные
While Client1.WaitForData(TimeOut) do //Теперь ждём данных
begin //''5''
ii:=Client1.ReceiveBuf(buffer[i],lenSav); //получаем данные
if ii>0 then i:=i+ii;
If i=LenRec then break;
end; //''-5''
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true; //''5''
for i:=0 to 23*KolOKR4Ost-1 do
Begin //''6''
A:=Buffer[i+8];
Data.KRData[KR].OKR[i+M*$5c]:=A;
end; //''-6''
end;
End;
End;
//******************************
KolParNastrA:=strtoint(SKRseting.KRSet.KR[KR].AOKol);
k:=0;
If KolParNastrA>0 then //Читаем A0
begin //''3''
KolParNastr14A:=KolParNastrA div 14;
KolParNastr14AOst:=KolParNastrA mod 14;
KRDataQueryByf[$06]:=$04;
for Param:=1 to KolParNastr14A do begin //поочерёдно читаем параметры пакетами по 14 штук //''4''
KRDataQueryByf[$07]:=$0E;
KRDataQueryByf[$02]:=$2D; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
for j:=1 to 14 do
begin //''5''
KRDataQueryByf[j*3+5]:=(strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,1]) and $FF); //начало номера алгоблока
KRDataQueryByf[j*3+6]:=(strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,1]) shr 8); //конец номера алгоблока
KRDataQueryByf[j*3+7]:=strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,2]); //номер входа алгоблока
end; //''-5''
k:=k+1;
KRDataQueryByf[$32]:=crc8(0,49,KRDataQueryByf); //Считаем CRC
LenSav:=$79; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.SendBuf(KRDataQueryByf[$00], $33); //Отправляем данные
While Client1.WaitForData(TimeOut) do //Теперь ждём данных
begin //''5''
ii:=Client1.ReceiveBuf(buffer[i],lenSav); //получаем данные
if ii>0 then i:=i+ii;
If i=LenRec then break;
end; //''-5''
i:=CRC8 (0,$78,buffer); //Считаем CRC
If buffer[$78]=i then //Проверяем CRC
begin
If (buffer[4] and $02)=1 then Rezerv:=true; //''5''
for i:=0 to 111 do
Begin //''6''
A:=Buffer[i+8];
Data.KRData[KR].AO[i+k*112]:=A;
end; //''-6''
end;
end; //''-4''
end; //Закончили читать ПАкеты AO
//*****************
If KolParNastr14Aost>0 then
begin //''4''
KRDataQueryByf[$07]:=KolParNastr14Aost;
KRDataQueryByf[$02]:=KolParNastr14Aost*3+3; //Количество байт
KRDataQueryByf[$03]:=$00; //отправляемых
KRDataQueryByf[$06]:=$04;
for j:=1 to KolParNastr14Aost do
begin //''5''
KRDataQueryByf[j*3+5]:=(strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,1]) and $FF); //начало номера алгоблока
KRDataQueryByf[j*3+6]:=(strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,1]) shr 8); //конец номера алгоблока
KRDataQueryByf[j*3+7]:=strtoint(SKRseting.KRSet.KR[KR].AO[14*k+j,2]); //номер входа алгоблока
end; //''-5''
k:=k+1;
KRDataQueryByf[KolParNastr14Aost*3+8]:=crc8(0,KolParNastr14Aost*3+8,KRDataQueryByf); //Считаем CRC
LenSav:=KolParNastr14Aost*8+9; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.SendBuf(KRDataQueryByf[$00], KolParNastr14Aost*3+9); //Отправляем данные
While Client1.WaitForData(TimeOut) do //Теперь ждём данных
begin //''5''
ii:=Client1.ReceiveBuf(buffer[i],lenSav); //получаем данные
if ii>0 then i:=i+ii;
If i=LenRec then break;
end; //''-5''
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If buffer[LenRec-1]=i then //Проверяем CRC
begin //''5''
for i:=0 to KolParNastr14Aost*8 do
Begin
If (buffer[4] and $02)=1 then Rezerv:=true; //''6''
A:=Buffer[i+8];
Data.KRData[KR].AO[i+k*112]:=A;
end; //''-6''
end; //''-5''
end; //Закончили читать остатки AO
//*****************************
If Data.KRData[KR].KolCom>0 Then
Begin
s:=True;
While s do begin
if Data.KRData[KR].Flag then sleep(1) else begin
Data.KRData[KR].Flag:=True;
For P:=0 to Data.KRData[KR].KolCom-1 do begin
For N:=0 to Data.KRData[KR].COM[P,2]+6 do KRDataQueryByf[n]:=Data.KRData[KR].COM[P,n];
LenSav:=$0A; //Считаем сколько должно придти
LenRec:=LenSav;
i:=0; //Сохраняем резервную копию(чтоб второй раз не считать)
Client1.SendBuf(KRDataQueryByf[$00], $0F); //Отправляем данные
While Client1.WaitForData(TimeOut) do //Теперь ждём данных
begin //''5''
ii:=Client1.ReceiveBuf(buffer[i],lenSav); //получаем данные
if ii>0 then i:=i+ii;
If i=LenRec then break;
end; //''-5''
i:=CRC8 (0,LenRec-1,buffer); //Считаем CRC
If (buffer[LenRec-1]<>i) or (Buffer[$07]+Buffer[$08]<>0) then //Проверяем CRC и ответ
begin
If (buffer[4] and $02)=1 then Rezerv:=true; //''5''
Form1.Label1.Caption:='Ошибка отправки данных в контроллер';
Client1.Active:=False;
Client1.Active:=True;
end; //''6''
Data.KRData[KR].KolCom:=$00;
end; //' to '-6''
Data.KRData[KR].Flag:=False;
s:=False;
end;
end;
end;
//*****************************
TimeKolIter:=TimeKolIter+1;
Form1.Label3.Caption:=IntToStr(TimeKolIter);
If Rezerv then begin
data.Potok.KRRezerv[KR]:=true;
break;
end;
if not KRReadWrite then break;
end; //Повтор
data.Potok.KRWork[KR]:=false;
Client1.Active:=false; //''-3''
Client1.Destroy;
end; //''-2''
function crc8 (Start, UsDataLen: integer; Mes: array of byte): byte;
var
i:word;
CR : cardinal;
begin
CR:=0;
for i:=Start to UsDataLen-1 do
begin
CR:=CR+Mes[i];
CR:= (CR and $FF) + (CR shr 8);
end;
CR:=(CR and $FF) + (CR shr 8);
CR:= not CR + $01;
CRC8:=CR and $FF;
end;
end.
[/more].
Может кто сталкивался с подобным, или хотя-бы где-нить читал, направте на путь истенный