unit OpenLampThrd;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls, ExtCtrls, ComCtrls;
type
TOpenLampThread=class(Tthread)
private
thclient_socket:tclientsocket;{该线程使用的Clientsocket对象}
procedure onconn(Sender:TObject;Socket: TCustomWinSocket);
protected
procedure execute;override;
public
constructor create(var thdclient_socket: tclientsocket);
end; implementation
uses StreetLamp, DM, Main;{ OpenLampThread }
constructor TOpenLampThread.create(var thdclient_socket: tclientsocket);
begin
inherited create(false);
freeonterminate:=true;
Resume;
end;procedure TOpenLampThread.execute;
var
i:integer;
begin
inherited create(false);
thclient_socket:=tclientsocket.create(nil);
thclient_socket.Active:=false;
thclient_socket.Address:='192.168.0.144';
thclient_socket.Port:=10002;
thclient_socket.OnConnect:=onconn;
thclient_socket.ClientType:=ctNonBlocking;
thclient_socket.Active:=true;//问题:此句执行后其Active属性还是False.调试时
//光标放在此行Active上,有时显示thclient_socket.Active=false,有时根本没显示。
i:=29;
thclient_socket.Socket.SendBuf(i,SizeOf(i)); sleep(500);
end;procedure TOpenLampThread.onconn(Sender:TObject;Socket: TCustomWinSocket);
var //这段代码因为 thclient_socket.Active不能置为true以至不能执行;
i:integer;
begin
i:=29;
thclient_socket.Socket.SendBuf(i,SizeOf(i));
end;end.在主程序中调用线程
procedure TfrmMain.tbtnThreadOpenClick(Sender: TObject);
begin
TOpenLampThread.create(frmstreetLamp.ClientSocket3);
end;
为什么不能改变在线程中自动生成的ClientSocket的Active属性?
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ScktComp, StdCtrls, ExtCtrls, ComCtrls;
type
TOpenLampThread=class(Tthread)
private
thclient_socket:tclientsocket;{该线程使用的Clientsocket对象}
procedure onconn(Sender:TObject;Socket: TCustomWinSocket);
protected
procedure execute;override;
public
constructor create(var thdclient_socket: tclientsocket);
end; implementation
uses StreetLamp, DM, Main;{ OpenLampThread }
constructor TOpenLampThread.create(var thdclient_socket: tclientsocket);
begin
inherited create(false);
freeonterminate:=true;
Resume;
end;procedure TOpenLampThread.execute;
var
i:integer;
begin
inherited create(false);
thclient_socket:=tclientsocket.create(nil);
thclient_socket.Active:=false;
thclient_socket.Address:='192.168.0.144';
thclient_socket.Port:=10002;
thclient_socket.OnConnect:=onconn;
thclient_socket.ClientType:=ctNonBlocking;
thclient_socket.Active:=true;//问题:此句执行后其Active属性还是False.调试时
//光标放在此行Active上,有时显示thclient_socket.Active=false,有时根本没显示。
i:=29;
thclient_socket.Socket.SendBuf(i,SizeOf(i)); sleep(500);
end;procedure TOpenLampThread.onconn(Sender:TObject;Socket: TCustomWinSocket);
var //这段代码因为 thclient_socket.Active不能置为true以至不能执行;
i:integer;
begin
i:=29;
thclient_socket.Socket.SendBuf(i,SizeOf(i));
end;end.在主程序中调用线程
procedure TfrmMain.tbtnThreadOpenClick(Sender: TObject);
begin
TOpenLampThread.create(frmstreetLamp.ClientSocket3);
end;
为什么不能改变在线程中自动生成的ClientSocket的Active属性?
解决方案 »
- winform窗体怎么同时移动多个按钮
- 急急急啊,callback 问题 !大家帮帮忙啊。。。。。
- 如何在windows中用delphi6屏蔽ctrl+alt+del键,并将其做成服务?谢谢,
- 菜鸟请教,时间如何转换成字符?简单问题。
- 在线等待 50分--怎么挨个返回listview1的各个元素
- 如何使用TDBRichEdit?
- 我想在一个表里增加一个新列,相关语句好像看到过,但不知道具体的书写格式,谁能帮一下忙吗?
- 高分求教在题库中随机抽题的算法问题
- 一个过程定义了四个形参,调用时在不同时候有时传三个、有时传两个形参,应该怎样做?
- 我编写的程序结束的时候用Application.destroy来关闭应用程序 可是在进程中还有 是不是我用错了
- 解决马上结帖!!!
- 条形码程序???????
begin
thclient_socket:=thdclient_socket;
freeonterminate:=true;
Resume;
inherited create(false);
end;即使这样解决了,你的程序还有好长的路要走。socket还不知道连上了没有,你的线程等了500毫秒就结束了!sleep又容易引起时间上的紊乱!
要是不嫌麻烦,把读出来的值输出到主线程,判断返回了正确的值了没有,如不正确再创建线程收啊收,要是还收不到,把时间延长点,让它sleep(500×2),然后再...
thclient_socket.ClientType:=ctBlocking;线程结束
freeonterminate:=false;
要不改用阻塞方式的2,要不就在主线程,非阻塞方式的SOCKET不会阻塞主线程的.