首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

Delphi Thread解决思路

2012-03-19 
Delphi Thread主窗体:Delphi(Pascal) codeprocedure TfrmMain.btnResumeClick(Sender: TObject)beginmyTh

Delphi Thread
主窗体:

Delphi(Pascal) code
procedure TfrmMain.btnResumeClick(Sender: TObject);begin  myThread := TClientThread.Create(LeftPart(cbbServer.Text, ':'), StrToInt(RightPart(cbbServer.Text, ':')));  myThread.Resume;  mmoLog.Lines.Add('线程已激活');end;procedure TfrmMain.btnSuspendClick(Sender: TObject);begin  if myThread = nil then  begin    ShowMessage('线程未创建!');    Exit;  end;  myThread.Suspend;  mmoLog.Lines.Add('线程已挂起');end;procedure TfrmMain.btnStopClick(Sender: TObject);begin  if myThread = nil then  begin    ShowMessage('线程未创建!');    Exit;  end;  myThread.Terminate;  myThread.WaitFor;  mmoLog.Lines.Add('线程已停止');end;


线程单元:
Delphi(Pascal) code
unit uClientThread;interfaceuses   Windows, Classes, SysUtils, IdTCPClient, uString, Main, uCommon, Messages, Dialogs;const  CM_DIAL = WM_USER + $100;  CM_HUNGUP = WM_USER + $101;type  TClientThread = class(TThread)  private    FClient: TIdTCPClient;    FRequest: TStrings;    FResponse: TStrings;    FNotifyHandle: HWND;   // FPioneerCtrl: HWND;    procedure DoDial;    procedure DoDrop;    procedure DoUpload;    procedure DoSave;  protected    procedure Execute; override;    procedure Insert(Index: Integer; const str: string);  public    constructor Create(const AHost: string; const APort: Integer);    destructor Destroy;    property NotifyHandle: HWND read FNotifyHandle write FNotifyHandle;  end;implementationconstructor TClientThread.Create;begin  inherited Create(True);  FRequest := TStringList.Create;  FResponse := TStringList.Create;  FClient := TIdTCPClient.Create(nil);  FClient.Host := AHost;  FClient.Port := APort;  FNotifyHandle := frmMain.mmoLog.Handle;end;procedure TClientThread.Execute;var  Len : Integer;  Cmd : string;begin  FClient.Connect(6000);  while not Terminated and FClient.Connected do  begin    try      Len := 0;      FRequest.Clear;      FClient.ReadBuffer(Len, SizeOf(Len));      FRequest.Text := FClient.ReadString(Len);      Cmd := FRequest.Values['Command'];      if Cmd = 'Dial' then        DoDial      else if Cmd = 'Drop' then        DoDrop      else if Cmd = 'Upload' then        DoUpload      else if Cmd = 'Save' then        DoSave;    except    end;  end;end;procedure TClientThread.DoDial;begin  Insert(frmMain.mmoLog.Lines.Count, FRequest.Text);end;procedure TClientThread.DoDrop;begin  Insert(frmMain.mmoLog.Lines.Count, FRequest.Text);end;procedure TClientThread.DoUpload;begin  Insert(frmMain.mmoLog.Lines.Count, FRequest.Text);end;procedure TClientThread.DoSave;begin  Insert(frmMain.mmoLog.Lines.Count, FRequest.Text);end;procedure TClientThread.Insert(Index: Integer; const str: string);var  SelStart, LineLen: Integer;  Line: string;begin  if Index >= 0 then  begin    SelStart := SendMessage(FNotifyHandle, EM_LINEINDEX, Index, 0);    if SelStart >= 0 then      Line := str + #13#10    else    begin      SelStart := SendMessage(FNotifyHandle, EM_LINEINDEX, Index - 1, 0);      if SelStart < 0 then Exit;      LineLen := SendMessage(FNotifyHandle, EM_LINELENGTH, SelStart, 0);      if LineLen = 0 then Exit;      Inc(SelStart, LineLen);      Line := #13#10 + str;    end;    SendMessage(FNotifyHandle, EM_SETSEL, SelStart, SelStart);    SendMessage(FNotifyHandle, EM_REPLACESEL, 0, Longint(PChar(Line)));  end;end;  destructor TClientThread.Destroy;begin  FClient.DisconnectSocket;  FClient.Free;  FRequest.Free;  FResponse.Free;  inherited destroy;end;end.


关闭窗体的时候出现 Socked Error 10093 错误
我在OnClose()事件中写myThread.Destroy 却把主线程停止了 为什么 望指点

[解决办法]
你没有初始化套接字WSAStartup
------解决方案--------------------


10093错误是:

Either the application has not called WSAStartup or WSAStartup failed. The application may be accessing a socket that the current active task does not own (that is, trying to share a socket between tasks), or WSACleanup has been called too many times.

这个错误是由于没有调用WSAStartup或者WSAStartup失败
[解决办法]
把这段改成

Delphi(Pascal) code
      if Cmd = 'Dial' then        self.Synchronize(DoDial)      else if Cmd = 'Drop' then        self.Synchronize(DoDrop)      else if Cmd = 'Upload' then        self.Synchronize(DoUpload)      else if Cmd = 'Save' then        self.Synchronize(DoSave); 

热点排行