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