这个线程是无限循环读取数据,一直在工作。
我想在一个界面的文本框里输入汉字,那里知道一打开输入法整个程序就是死了,不过是微软自带的输入法还是紫光输入法。奇怪就是,我在其他地方copy汉字粘贴上去又没事。在没有打开汉字输入法而输入英文字母就没事。
如何在无限循环线程的程序的文本框内输入汉字呢?

解决方案 »

  1.   

    >>如何在无限循环线程的程序的文本框内输入汉字呢?表達不清楚, 我的不少程序都帶有線程, 從沒發生這種問題
      

  2.   

    我也碰到这样的问题,aiirii等等,我整理出来代码
      

  3.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, ScktComp, StdCtrls;type
      TForm1 = class(TForm)
        ServerSocket1: TServerSocket; //ServerType := stThreadBlocking;
        Button1: TButton;
        Memo1: TMemo;  //在其中切换输入法就会死程序
        procedure ServerSocket1ClientError(Sender: TObject;
          Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
          var ErrorCode: Integer);
        procedure ServerSocket1GetThread(Sender: TObject;
          ClientSocket: TServerClientWinSocket;
          var SocketThread: TServerClientThread);
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;type
      TClientThread = class(TServerClientThread)
      private
        FRBuf: array [0..4095] of Char;
      protected
        procedure ClientExecute; override;
      end;var
      Form1: TForm1;implementation{$R *.dfm}procedure TForm1.ServerSocket1ClientError(Sender: TObject;
      Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
      var ErrorCode: Integer);
    begin
      ErrorCode := 0;
      Socket.Close;
    end;procedure TForm1.ServerSocket1GetThread(Sender: TObject;
      ClientSocket: TServerClientWinSocket;
      var SocketThread: TServerClientThread);
    var
      A: DWORD;
    begin
      SocketThread := TClientThread.Create(False, ClientSocket);
      A := ClientSocket.Handle;  //如果没有这个语句就不会死
            //(这也是我整理这段代码的时候发现的,我原来程序中是在另外的
            // 一个列表中保存了该Handle的值,在此却发现只要读取了ClientSocket
            // 的Handle,程序就会死掉,现象为当客户端连接到该服务器后,在Memo中
            // 切换输入法,我默认的是Ctrl + Space,程序就会没有任何响应【Delphi 6/7】)
    end;{ TClientThread }
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      Self.ServerSocket1.Open;
    end;{ TClientThread }procedure TClientThread.ClientExecute;
    var
      SocketStream : TWinSocketStream;
      BytesRead, iPos: Integer;
    begin
      while not Terminated do
      begin
        SocketStream := TWinSocketStream.Create(ClientSocket, 5 * 1000);
        try
          try
            iPos := 0;
            while (SocketStream.WaitForData(5 * 1000)) do
            begin
              BytesRead := SocketStream.Read(FRBuf[iPos], SizeOf(LongWord));
            end;
          except
            raise;
          end;
        finally
         SocketStream.Free;
         ClientSocket.Close;
         Terminate;
        end;
      end;
    end;end.