博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
统一一个文件中bit位 1 的个数
阅读量:6713 次
发布时间:2019-06-25

本文共 2862 字,大约阅读时间需要 9 分钟。

 

unit
 CountThread;
interface
uses
  Classes, SysUtils, Dialogs, Math;
type
  TCountThread 
=
 
class
(TThread)
  
private
    FFileName: 
string
;
    FFileSize: Int64;
    FOnStartCount: TNotifyEvent;
    FOnProcess: TNotifyEvent;
    FOnEndCount: TNotifyEvent;
    FSumBit: Int64;
    FBlockCount: Integer;
    
function
 CountBits(B: Byte): Integer;
  
protected
    
procedure
 Execute;
override
;
  
public
    
property
 FileName: 
string
 
read
 FFileName 
write
 FFileName;
    
property
 FileSize: Int64 
read
 FFileSize 
write
 FFileSize;
    
property
 BlockCount: Integer 
read
 FBlockCount 
write
 FBlockCount;
    
property
 SumBit: Int64 
read
 FSumBit 
write
 FSumBit;
    
property
 OnStartCount: TNotifyEvent 
read
 FOnStartCount 
write
 FOnStartCount;
    
property
 OnProgress: TNotifyEvent 
read
 FOnProcess 
write
 FOnProcess;
    
property
 OnEndCount: TNotifyEvent 
read
 FOnEndCount 
write
 FOnEndCount;
  
end
;  
implementation
const
  BlockSize 
=
 
102400
;
{
 TCountThread 
}
function
 TCountThread.CountBits(B: Byte): Integer;
begin
  Result :
=
 
0
;
  
while
 b
<>
0
 
do
 
begin
    
if
 Odd(B) 
then
 Inc(Result);
    b :
=
 b 
shr
 
1
;
  
end
;
end
;
procedure
 TCountThread.Execute;
var
  s: TStream;
  i, rc: Integer;
  str: 
array
[
1
..BlockSize] 
of
 byte;
begin
  
inherited
;
  FSumBit :
=
 
0
;
  s :
=
 TFileStream.Create(FFileName, fmOpenRead);
  FFileSize :
=
 s.Size;
  FBlockCount :
=
 Ceil(FFileSize 
/
 BlockSize);
  FOnStartCount(Self);
  
while
 FBlockCount 
>
 
0
 
do
 
begin
    rc :
=
 s.Read(str, BlockSize);
    
for
 i :
=
 
1
 
to
 rc 
do
 
begin
      FSumBit :
=
 FSumBit 
+
 CountBits(str[i]);
    
end
;
    FOnProcess(Self);
    Dec(FBlockCount);
  
end
;
  FOnEndCount(Self);
  FreeAndNil(s);
end
;
end
.
unit
 Unit1;
interface
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, CountThread, ComCtrls, DateUtils;
type
  TForm1 
=
 
class
(TForm)
    btn1: TButton;
    mmo1: TMemo;
    dlgOpen1: TOpenDialog;
    pb1: TProgressBar;
    
procedure
 btn1Click(Sender: TObject);
  
private
    th: TCountThread;
    StartTime: TDateTime;
    
procedure
 OnProcess(Sender: TObject);
    
procedure
 OnStartCount(Sender: TObject);
    
procedure
 OnEndCount(Sender: TObject);
  
public
    
{
 Public declarations 
}
  
end
;
var
  Form1: TForm1;
implementation
{
$R *.dfm
}
procedure
 TForm1.btn1Click(Sender: TObject);
begin
  
if
 dlgOpen1.Execute 
then
 
begin
    StartTime :
=
 Now;
    th :
=
 TCountThread.Create(True);
    th.FileName :
=
 dlgOpen1.FileName;
    th.OnProgress :
=
 OnProcess;
    th.OnStartCount :
=
 OnStartCount;
    th.OnEndCount :
=
 OnEndCount;
    th.Resume;
  
end
;
end
;
procedure
 TForm1.OnEndCount(Sender: TObject);
begin
  mmo1.Lines.Add(Format(
'
个数:%d, 耗时:%fms,文件名:%s, 文件大小: %d
'
, [TCountThread(Sender).SumBit, MilliSecondSpan(Now, StartTime), dlgOpen1.FileName, TCountThread(Sender).FileSize]));
end
;
procedure
 TForm1.OnProcess(Sender: TObject);
begin
  pb1.Position :
=
 pb1.Position 
+
 
1
;
end
;
procedure
 TForm1.OnStartCount(Sender: TObject);
begin
  pb1.Max :
=
 TCountThread(Sender).BlockCount;
  pb1.Position :
=
 
0
;
end
;
end
.

 

转载于:https://www.cnblogs.com/jxgxy/archive/2011/05/07/2039996.html

你可能感兴趣的文章
python之sys模块
查看>>
为什么你的MySQL跑得很慢?
查看>>
系统策略规则
查看>>
yii 和 zend studio 集成
查看>>
红帽7搭建httpd的三种模式(基于主机,端口,IP)
查看>>
LTP--linux稳定性测试 linux性能测试 ltp压力测试
查看>>
liunx下把网站文件压缩为zip文件备份提供给ftp下载
查看>>
Java发送邮件
查看>>
java--时间浅谈
查看>>
SQL Server以Online模式创建索引
查看>>
《FreeKick》战术_游戏前线
查看>>
extmail 界面修改
查看>>
XP如何重装Internet Explorer
查看>>
github
查看>>
shell基础应用
查看>>
python pip源配置
查看>>
clamav杀毒软件部署笔记
查看>>
小测试
查看>>
涨姿势一下:#include<>和#include""的区别
查看>>
quartz spring配置
查看>>