|
#1
|
|||
|
|||
Вопрос о потоке
Проблема при CreateThread
В задаче у меня в потоке считывается файл по 16 байт и в StringGrid выводится инфо в двоичном коде. Если файл не большого размера то все в порядке, а если нет то программа вываливается, поток при этом не успевает дойти до завершения. в чем может быть проблема? помогите плз |
#2
|
||||
|
||||
телепаты в отпуске
Arrrgh |
#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. |