![]() |
|
|
|
|
#1
|
|||
|
|||
|
Проблема при CreateThread
В задаче у меня в потоке считывается файл по 16 байт и в StringGrid выводится инфо в двоичном коде. Если файл не большого размера то все в порядке, а если нет то программа вываливается, поток при этом не успевает дойти до завершения. в чем может быть проблема? помогите плз |
|
#2
|
||||
|
||||
|
телепаты в отпуске
|
|
#3
|
|||
|
|||
|
Код:
procedure TForm1.Button2Click(Sender: TObject);
Var
ThId : DWORD;
begin
BeginThread(Nil,0,@OpenFile,nil,0,ThId);
end;
procedure OpenFile;
Var
hFile :Cardinal;
dwReaded : DWORD;
Buff : array [1..16] of Byte;
c : Char;
i,j,n,rez : Integer;
CharStr,Tmp : String;
begin
hFile:= CreateFile(PChar(Form1.ListView1.Selected.SubItems.Strings[3]),
GENERIC_READ,
FILE_SHARE_READ,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
n:=16;
j:=0;
Form1.StringGrid1.RowCount:=1;
Form1.StringGrid1.ColCount:=round(n/2)+2;
Form1.StringGrid1.ColWidths[0]:=70;
For i:=1 to Form1.StringGrid1.ColCount-2 do
Form1.StringGrid1.ColWidths[i]:=40;
Form1.StringGrid1.ColWidths[Form1.StringGrid1.ColCount-1]:=150;
Repeat
Form1.StringGrid1.Rows[j].Clear;
For i:=1 to n do Buff[i]:=0;
ReadFile(hFile,Buff,n,dwReaded,nil);
tmp:='';
CharStr:='';
if dwReaded=n then
for i:=1 to n do
Begin
If Buff[i]<=127 then
If ((Buff[i]>=0) and (Buff[i]<=31) or(Buff[i]=127)) then c:='.'
Else c:=Char(Buff[i])
Else c:=Char(Buff[i]);
CharStr:=CharStr+c;
Tmp:=Tmp+IntToHex(Buff[i],2);
if i mod 2 =0 then
Begin
rez:=Round(i/2);
Form1.StringGrid1.Cells[rez,j]:=Tmp;
Tmp:='';
End;
End
Else
for i:=1 to dwReaded do
Begin
If Buff[i]<=127 then
If ((Buff[i]>=0) and (Buff[i]<=31)or(Buff[i]=127)) then c:='.'
Else c:= Char(Buff[i])
Else c:= Char(Buff[i]);
If (i > dwReaded) then Tmp:= Tmp + ' '
else Tmp:= Tmp + IntToHex(Buff[i],2);
CharStr:= CharStr + c;
if i mod 2 =0 then
Begin
rez:= Round(i/2);
Form1.StringGrid1.Cells[rez,j]:= Tmp;
Tmp:='';
End;
End;
If Form1.RadioGroup1.ItemIndex = 1 then
Form1.StringGrid1.Cells[0,j]:=IntToHex(j*n,8)
Else
Begin
tmp:=IntToHex(j*n,8);
Form1.StringGrid1.Cells[0,j]:=IntToStr(StrToInt( '$' +tmp));
End;
Form1.StringGrid1.Cells[Form1.StringGrid1.ColCount-1,j]:=CharStr;
Inc(j);
If dwReaded=n then
Form1.StringGrid1.RowCount:=Form1.StringGrid1.RowCount+1;
Until (dwReaded<n);
CloseHandle(hFile);
end;Последний раз редактировалось Admin, 23.05.2010 в 17:54. |