亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? unit1.pas

?? 多線程網絡傳輸 v1.0S_CXV軟件,對于多線程的極其有用.
?? PAS
字號:
//************************************************//
//*           多線程網絡傳輸客戶端               *//
//*              作者:Feiler                    *//
//*            Delphibbs ID:masm                 *//
//*               QQ:16540127                    *//
//*            Email:neted@tom.com               *//
//*你可以修改下面的代碼,但請保留以上原信息      *//
//************************************************//

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, ExtCtrls, StdCtrls, IdBaseComponent, IdComponent,
  IdTCPConnection, IdTCPClient,Unit2;
const
packsize=65000;//包大小
type
TRevBuffer=packed record
 masmID:Word;//未用
  ID:Word;//標記
  F1:DWord;
  F2:DWord;
  F3:DWord;
  F4:DWord;
  Len:DWord;
  MD:Int64;
end;
TSendBuffer=packed record
  masmID:Word;//未用
  ID:Word;//標記
  F1:DWord;
  F2:DWord;
  F3:DWord;
  F4:DWord;
  Len:DWord;//數據區的大小
  MD:Int64;//摘要
  buffer:Array[0..packsize-1] of byte;
end;
//性能監測線程
type
  TMonitorThread = class(TThread)
  private
  SecondTimer:DWord;
  protected
    procedure Execute; override;
  public
  constructor Create(); reintroduce;

  end;



type
  TFeiler = class;
  TSocketThread = class(TThread)
  private
    Rev:TRevBuffer;
    Snd:TSendBuffer;
    PRev,PSnd,TP,UP:PByte;
    TempPointer:PByte;
    RemainBytes:Word;
    ReceivedCounter:Integer;
    HeaderFinished,BodyFinished,PushTransporting:Boolean;

    FeilerThread : TFeiler;
    MyIndex:Integer;
    FClient:TIdTCPClient;
    SendBytes:DWord;//該線程要傳輸的字節數
    MapOffset:DWord;//文件映像指針偏移
    FileMapPointer:PByte;//內存映像文件指針
    SendBlock:DWord;//該線程要傳輸的塊數
    Thread_H,Thread_T:DWord;
    procedure Process;
    procedure Branch;
    procedure RequestTransfer;
    procedure ServerReady;
    procedure transporting;
  protected
    procedure Execute; override;
  public
    constructor Create(F: TFeiler;Index:Integer;Offset:DWord;Count:DWord;FileMap:PByte); reintroduce;
  end;
  TFeiler = class(TForm)
    Edit1: TEdit;
    ComboBox1: TComboBox;
    Button1: TButton;
    Button2: TButton;
    Edit2: TEdit;
    OpenDialog1: TOpenDialog;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    Button3: TButton;
    Panel1: TPanel;
    StatusBar1: TStatusBar;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private declarations }
  public
    FileSize:DWord;//要傳輸的文件大小
    SocketThread:Array of TSocketThread;
    Event:Array of THandle;
    Instructor:Array of TProgressBar;
    MonitorThread:TMonitorThread;
    MP:PByte;
    { Public declarations }
  end;

var
  Feiler: TFeiler;
  ShowProgress:Boolean;
  HeightInc:Integer;



implementation

{$R *.dfm}
constructor TSocketThread.Create(F: TFeiler;Index:Integer;Offset:DWord;Count:DWord;FileMap:PByte);
var
Iswork:Boolean;
begin
  FeilerThread := F;
  MyIndex:=Index;
  MapOffset:=Offset;
  SendBytes:=Count;
  FileMapPointer:=FileMap;
  INC(FileMapPointer,Offset);
  SentBytes[MyIndex]:=0;
  IF Index=0 then
  Iswork:=False
    else
    Iswork:=True;
  ReceivedCounter:=32;
  PRev:=@Rev;PSnd:=@Snd;TempPointer:=PRev;
  inherited Create(IsWork);
end;

procedure TSocketThread.Execute;
var
H,I,J:Integer;
Thread_L:Integer;
CurPointerOffset:DWord;
File_Name:String[250];
begin
  FClient:=TIdTCPClient.Create(nil);
  FClient.Host:=FeilerThread.Edit1.Text;
  FClient.Port:=60606;
  try
  FClient.Connect(10000);
  except
  //錯誤處理
  Application.MessageBox('無法連接服務器','ERROR',MB_ICONERROR);
  FClient.Free;
  exit;
  end;
  //**接收服務器信息**//
  Thread_H:=(SendBytes-1) div packsize +1;//需要傳輸Thread_H個數據塊
  Thread_T:=SendBytes-(Thread_H-1)*packsize;//尾巴
  FeilerThread.Instructor[MyIndex].Max:=Thread_H;
  Snd.F2:=Thread_H;
  IF MyIndex=0 then//0號線程負責初始化服務器
  begin
  Snd.ID:=0;//通知服務器建立文件
  TP:=PSnd;Inc(TP,32);
  File_name:=ExtractFileName(FeilerThread.Edit2.Text);
  Snd.Len:=Length(File_name)+1;
  Snd.F1:=FeilerThread.FileSize;
  UP:=@File_name;
  move(UP^,TP^,Snd.Len);
  FClient.Socket.Send(PSnd^,Snd.Len+32);//通知服務器
  repeat
  process;
  until Rev.ID=3;//Snd.F1=Snd.F2;
  SentBytes[MyIndex]:=SentBytes[MyIndex]+Snd.Len;//最后一個尾巴
  H:=Length(FeilerThread.Event);

    IF H>1 then//2個線程以上的話
    WaitForMultipleObjects(H-1,@FeilerThread.Event[1],True,INFINITE);
    Feiler.MonitorThread.Terminate;
    Snd.ID:=3;//告知服務器關閉內存影像
    Snd.Len:=0;
    FClient.Socket.Send(PSnd^,32);
    UnMapViewOfFile(FeilerThread.MP);//關閉內存映像
    For I:=0 to H-1 do
    CloseHandle(FeilerThread.Event[I]);
    SetLength(FeilerThread.Event,0);
    FeilerThread.Button1.Enabled:=True;
  end
    else
        begin
        RequestTransfer;
        repeat
        process;
        until Rev.ID=3;//Snd.F1=Snd.F2;
        SentBytes[MyIndex]:=SentBytes[MyIndex]+Snd.Len;
        SetEvent(FeilerThread.Event[MyIndex]);
        end;
FClient.Disconnect;

end;

procedure TFeiler.Button2Click(Sender: TObject);
var
F:Tsearchrec;
begin
IF OpenDialog1.Execute then
Edit2.Text:=OpenDialog1.FileName;
IF FindFirst(Edit2.Text,FaAnyfile,F)=0 then
FileSize:=F.Size;
end;

procedure TFeiler.Button1Click(Sender: TObject);
var
H,I,J,K,U:Integer;
FH,MH:THandle;
begin
//建立文件內存映像
Button1.Enabled:=False;
FH:=FileOpen(Edit2.Text,fmOpenRead);
MH:=CreateFileMapping(FH,nil,Page_ReadOnly,0,FileSize,nil);
CloseHandle(FH);
MP:=MapViewOfFile(MH,File_Map_Read,0,0,FileSize);
CloseHandle(MH);
J:=strtoint(ComboBox1.Text);
I:=(FileSize-1) div (1024*1024) + 1;//最多線程數
IF  J>I then
J:=I;
//一共有J個線程
//建立進度指示
ThreadCount:=J;
For K:=0 to  Length(Instructor)-1 do
Instructor[K].Free;
SetLength(Instructor,J);
SetLength(SentBytes,J);
For K:=0 to J-1 do
begin
Instructor[K]:=TProgressBar.Create(self);
Instructor[K].Left:=0;
Instructor[K].Top:=K*16;
Instructor[K].Width:=390;
Instructor[K].Step:=1;
Instructor[K].Parent:=Panel1;
end;

I:=FileSize div J;//每個線程的傳輸字節
K:=FileSize-I*J;//最后一個線程要多傳輸的字節,尾巴
U:=I;
SetLength(SocketThread,J);
SetLength(Event,J);
For H:=0 to J-1 do
begin
IF H=J-1 then
I:=I+K;//最后的數據塊
SocketThread[H]:=TSocketThread.Create(self,H,H*U,I,MP);
Event[H]:=CreateEvent(nil,False,False,nil);

end;//循環結束

end;

procedure TSocketThread.Branch;
begin
case Rev.ID of
1:ServerReady;
2:transporting;

end;
end;

procedure TSocketThread.RequestTransfer;
begin
Snd.ID:=1;
Snd.F1:=0;
Snd.Len:=0;
FClient.Socket.Send(PSnd^,32);
end;

procedure TSocketThread.Process;
var
Bytes:Integer;
begin
IF RemainBytes>0 then//上次還有字節沒收取
    begin
    ReceivedCounter:=ReceivedCounter-RemainBytes;
    IF ReceivedCounter>0 then//接收剩余字節后數據報尚未完成接收
    begin
    Bytes:=RemainBytes;//接收剩余
    RemainBytes:=0;
    end
        else
        begin
            IF ReceivedCounter=0 then//剩余字節剛好接收完成
            begin
            Bytes:=RemainBytes;
            RemainBytes:=0;
            IF HeaderFinished then
            BodyFinished:=True
            else
                begin
                HeaderFinished:=True;//如果頭完成就是體完成,否則只是頭完成
                PushTransporting:=True;
                end;
            end
                else
                begin   //剩余字節超過本數據報大小,產生數據粘連
                Bytes:=ReceivedCounter+RemainBytes;
                RemainBytes:=RemainBytes-Bytes;//完成本數據報后剩余字節
                IF HeaderFinished then
                BodyFinished:=True
                    else
                        begin
                        HeaderFinished:=True;//如果頭完成就是體完成,否則只是頭完成
                        PushTransporting:=True;
                        end;
                end;
        end;
     FClient.ReadBuffer(TempPointer^,Bytes);
     Inc(TempPointer,Bytes);
     IF (Rev.Len=0) and HeaderFinished then//只要頭
     begin
     HeaderFinished:=False;
     PushTransporting:=False;
     TempPointer:=PRev;
     ReceivedCounter:=32;//準備下一個頭
     Branch;//分支處理
     end
        else
        begin
            IF PushTransporting then //正在傳輸body
            begin
            PushTransporting:=False;
            ReceivedCounter:=Rev.Len;
            end
            else
                IF BodyFinished then
                begin
                TempPointer:=PRev;
                HeaderFinished:=False;
                BodyFinished:=False;
                ReceivedCounter:=32;//準備下一個頭
                Branch;//分支處理
                end

        end;

     end
     else
        begin//RemainBytes=0
        Try
        RemainBytes:=FClient.ReadFromStack(True,15000,True);
        Except
        exit;
        end;

        end;



end;


procedure TSocketThread.ServerReady;
var
H:Integer;
begin
For H:=2 to strtoint(Feiler.ComboBox1.Text) do
Feiler.SocketThread[H-1].Resume;
RequestTransfer;
Feiler.MonitorThread:=TMonitorThread.Create;
end;

procedure TSocketThread.transporting;
var
FTT,FUU:PByte;
begin
SentBytes[MyIndex]:=SentBytes[MyIndex]+Snd.Len;//已發送字節
Snd.ID:=2;
Snd.F1:=Rev.F1;
IF Snd.F1=Snd.F2 then
Snd.Len:=Thread_T
else
Snd.Len:=packsize;
Snd.F3:=MapOffset+(Snd.F1-1)*packsize;
FTT:=FileMapPointer;
INC(FTT,(Snd.F1-1)*packsize);
FUU:=PSnd;Inc(FUU,32);
move(FTT^,FUU^,Snd.Len);
FClient.Socket.Send(PSnd^,Snd.Len+32);
FeilerThread.Instructor[MyIndex].StepIt;
end;

procedure TFeiler.Button3Click(Sender: TObject);
begin
IF  Not(ShowProgress)    then
Button3.Caption:='<<進度顯示'
else
    Button3.Caption:='進度顯示>>';
ShowProgress:=Not(ShowProgress);
IF ShowProgress then
begin
HeightInc:=strtoint(ComboBox1.Text)*20;
Feiler.Height:=Feiler.Height+HeightInc;



end
else
    begin
    Feiler.Height:=Feiler.Height-HeightInc;

    end;





end;

{ TMonitorThread }



constructor TMonitorThread.Create;
begin
SecondTimer:=0;
inherited Create(false);
end;

procedure TMonitorThread.Execute;
var
H,I,V:DWord;
begin
While Not(Terminated) do
    begin
    Sleep(1000);
    SecondTimer:=SecondTimer+1;
    H:=0;
    For I:=0 to ThreadCount-1 do
    H:=H+SentBytes[I];
    V:=H div SecondTimer;
    V:=V div 1024;
    Feiler.StatusBar1.Panels[2].Text:='平均速率:'+Inttostr(V)+'KB/S';
    end;

end;

procedure TFeiler.FormClose(Sender: TObject; var Action: TCloseAction);
var
K:Integer;
begin
For K:=0 to  Length(Instructor)-1 do
Instructor[K].Free;
SetLength(Instructor,0);
SetLength(SentBytes,0);
SetLength(SocketThread,0);
SetLength(Event,0);
end;

end.


?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美一区二区视频在线观看2020 | 国产主播一区二区三区| 中文字幕高清不卡| 91麻豆精品国产91久久久| www.亚洲免费av| 蜜臀av性久久久久蜜臀aⅴ| 中文字幕亚洲精品在线观看| 精品国产乱码久久久久久蜜臀 | 成人av网站在线| 久久国产欧美日韩精品| 亚洲电影一级黄| 中文字幕一区二区三区四区不卡| 精品国产欧美一区二区| 欧美日韩亚洲国产综合| 91丨九色丨黑人外教| 国产成人av一区二区三区在线| 久久精品二区亚洲w码| 亚洲成人tv网| 亚洲一区二区中文在线| 成人免费在线观看入口| 国产精品网友自拍| 国产午夜亚洲精品理论片色戒| 日韩美女视频一区二区在线观看| 欧美午夜不卡视频| 一本大道久久a久久综合| 成人久久久精品乱码一区二区三区| 精品一二线国产| 久久精工是国产品牌吗| 美女脱光内衣内裤视频久久网站| 亚洲国产视频在线| 亚洲国产欧美在线人成| 亚洲国产精品人人做人人爽| 一区二区三区精品在线| 一区二区三区不卡视频| 一区二区三区欧美视频| 亚洲国产aⅴ成人精品无吗| 亚洲一区二区三区不卡国产欧美| 一区二区三区在线影院| 亚洲综合999| 亚洲一区二区三区四区在线观看 | 美女免费视频一区二区| 麻豆成人久久精品二区三区红 | 国产一区二区在线视频| 黑人巨大精品欧美黑白配亚洲| 久久国产尿小便嘘嘘尿| 狠狠狠色丁香婷婷综合激情| 国产精品99久久久久久宅男| 国产不卡高清在线观看视频| 波多野洁衣一区| 色哟哟国产精品免费观看| 在线视频综合导航| 精品视频1区2区3区| 欧美日韩国产区一| 欧美成人a在线| 国产午夜精品久久久久久免费视| 国产精品美女久久久久高潮| 亚洲欧美日韩系列| 亚洲妇女屁股眼交7| 麻豆国产欧美一区二区三区| 国产精品一区二区三区乱码| 北岛玲一区二区三区四区| 色婷婷狠狠综合| 欧美一区二区精品久久911| 精品国精品国产尤物美女| 中文欧美字幕免费| 亚洲一卡二卡三卡四卡无卡久久| 日韩精品一级中文字幕精品视频免费观看 | 一区二区三区在线看| 五月婷婷欧美视频| 国产一区二区视频在线播放| 成人理论电影网| 欧美日韩国产另类一区| 欧美tickling网站挠脚心| 中文字幕欧美日韩一区| 亚洲综合丁香婷婷六月香| 美女国产一区二区三区| 成人午夜电影久久影院| 欧美日韩一区久久| 欧美mv日韩mv亚洲| 亚洲人成亚洲人成在线观看图片| 首页国产欧美久久| 丁香婷婷综合色啪| 欧美女孩性生活视频| 国产欧美日韩卡一| 午夜久久久久久久久久一区二区| 国产剧情一区二区三区| 色偷偷久久人人79超碰人人澡| 欧美一区二区成人| 亚洲欧美日韩国产成人精品影院 | 午夜视频在线观看一区| 国产一区二区三区精品欧美日韩一区二区三区 | 91麻豆.com| 久久夜色精品一区| 亚洲成人激情综合网| 国产精品一级在线| 欧美精品粉嫩高潮一区二区| 国产日韩欧美高清在线| 日韩激情一二三区| 99久久精品免费看| 久久综合久久久久88| 亚洲国产精品一区二区尤物区| 国产盗摄精品一区二区三区在线| 欧美三区在线视频| 国产精品久久精品日日| 精品在线观看视频| 欧美日韩精品是欧美日韩精品| 国产精品国产三级国产有无不卡| 美女视频第一区二区三区免费观看网站| 99re这里只有精品首页| 久久久久久久久久电影| 久久精品国产精品亚洲红杏| 欧美性大战久久久久久久 | 亚洲精品中文在线影院| 国产精选一区二区三区| 欧美一区二区三区在线观看| 亚洲精品videosex极品| www.性欧美| 国产午夜精品一区二区三区嫩草| 精品一区二区精品| 欧美一级片在线| 日韩专区一卡二卡| 欧美视频在线不卡| 亚洲精品欧美专区| 97久久久精品综合88久久| 国产精品素人一区二区| 国产美女在线精品| 欧美白人最猛性xxxxx69交| 日本中文一区二区三区| 欧美美女喷水视频| 午夜精品久久久久久不卡8050| 欧美手机在线视频| 亚洲影院免费观看| 欧美三级电影网站| 五月婷婷久久丁香| 欧美精品久久久久久久多人混战| 一区二区激情视频| 欧美日韩一级大片网址| 亚洲高清视频的网址| 9191成人精品久久| 欧美在线视频全部完| 一区二区三区蜜桃网| 在线影院国内精品| 午夜久久久久久久久久一区二区| 欧美网站一区二区| 日韩精品电影一区亚洲| 日韩欧美综合一区| 国产一区二区在线观看视频| 欧美国产精品久久| 91在线你懂得| 亚洲不卡在线观看| 日韩视频在线你懂得| 久久精品国产精品亚洲红杏| 国产婷婷一区二区| 9人人澡人人爽人人精品| 亚洲免费观看高清完整版在线 | 欧美日韩精品免费| 日本色综合中文字幕| 精品粉嫩aⅴ一区二区三区四区| 极品销魂美女一区二区三区| 欧美国产日韩亚洲一区| 色94色欧美sute亚洲线路二 | 成熟亚洲日本毛茸茸凸凹| 国产精品福利一区二区三区| 色婷婷av一区二区三区软件| 天天色天天操综合| 精品电影一区二区| 91免费国产在线观看| 午夜精品久久久久| 久久久777精品电影网影网 | 国产精品美女久久久久久久网站| 91色porny蝌蚪| 日本中文在线一区| 中文字幕免费在线观看视频一区| 91农村精品一区二区在线| 日韩国产一二三区| 久久久久99精品国产片| 91精品办公室少妇高潮对白| 日韩激情一区二区| 国产精品久久久久久久久免费桃花 | 久久精品在这里| 色偷偷久久一区二区三区| 蜜臀91精品一区二区三区| 国产精品丝袜在线| 欧美日韩aaaaaa| 成人免费高清在线观看| 日韩在线观看一区二区| 国产精品嫩草影院av蜜臀| 欧美日韩国产三级| 国产91精品欧美| 首页亚洲欧美制服丝腿| 中文字幕一区不卡| 欧美成人a视频| 欧美午夜电影网| 丁香网亚洲国际| 久久成人av少妇免费| 伊人色综合久久天天人手人婷| 久久蜜桃一区二区| 欧美肥妇free| 色综合一区二区三区| 国产馆精品极品|