Time在线程中为什么不会执行?

y9165102 2009-01-09 04:57:53
为什么在线程中调用时间控件会不执行呢?

procedure Tkk.Timer1Timer(Sender: TObject);
begin
form1.memo1.lines.add('aa');
end;


procedure Tkk.Execute;
var
Time:TTimer;
begin
{ Place thread code here }
Time:=TTimer.Create(nil);
Time.Enabled:=True;
Time.Interval:=1;
Time.OnTimer:=Timer1Timer;
end;
...全文
501 64 打赏 收藏 转发到动态 举报
写回复
用AI写文章
64 条回复
切换为时间正序
请发表友善的回复…
发表回复
y9165102 2009-01-12
  • 打赏
  • 举报
回复
我想简单一些呀。。。。如果是这样的话,我完全可以直接先打开他的网页,然后判断他的大小,然后再按照接收值大小来对照。如果不相等,我就继续消息循环。。

但是如果这样做的,会造成很多问题发生。最严重的就是,当我们的电脑如果经常打开网页和关闭网页。会令到有的网站打不开。就是平时当你打开网页的时候那个网站本来很快的。但是最后却因为前面的提交搞得下一个地址形成了一定的等待。。。

所以我才不这样做呀
僵哥 2009-01-12
  • 打赏
  • 举报
回复
其实在我那份C++代码当中就有演示,那份代码是下载一个Norton的更新包,先到他的发布页面上取得最新的更新包,然后通过解析HTML代码,取得更新包的更新时间(文件名当中包含),然后跟本地的文件进行比较判断是否需要下载更新,如果需要则发起下载请求,然后进行下载。只是这一整个流程都是在主线程当中完成,对于使用多线程的情况,完全可以把里面的代码直接搬移到线程当中去处理(当然,那份代码写得着实很糟糕^_^)。
y9165102 2009-01-12
  • 打赏
  • 举报
回复
肯定是还要接收返回完整的HTML页面,要不然我怎么判断是否提交成功呢?
y9165102 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 unsigned 的回复:]
建议楼主,还是把想要做的功能详细的列出来,综合起来才好处理,否则一会是线程当中的Timer,一会是线程中使用Socket,到最后却又卡在衔接上面。

个人理解是,楼主希望自己写代码来实现对一批地址的HTTP交互(可能是POST也可能是GET),同时希望在交互过程当中实现超时控制。为了达到并行处理,并且相互不受影响,所以希望采用多线程来实现。
[/Quote]

嗯~我写了一个后台管理器。就是当我有新的文章发布的时候。可以同时发布到其他的网站上去。

具体实现功能
循环取得一条值
然后开始POST到我要发布的网页(用socket)
就是这么简单的功能
僵哥 2009-01-12
  • 打赏
  • 举报
回复
建议楼主,还是把想要做的功能详细的列出来,综合起来才好处理,否则一会是线程当中的Timer,一会是线程中使用Socket,到最后却又卡在衔接上面。

个人理解是,楼主希望自己写代码来实现对一批地址的HTTP交互(可能是POST也可能是GET),同时希望在交互过程当中实现超时控制。为了达到并行处理,并且相互不受影响,所以希望采用多线程来实现。
y9165102 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 43 楼 unsigned 的回复:]
引用 42 楼 y9165102 的回复:
关于这一位朋友说的我已经在前天晚上实验过了,但是却不行
原因在于,程序还是只返回一半的值
procedure TpostTj.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Pos('utf',urlpostxx)>0 then
urlpostxx:=utf8toansi(urlpostxx);
urlpostxx:='断'+urlpostxx;
abcxdindex.statusbar1.Panels[3].Text:='与…
[/Quote]

理解不了~不明白与我这个有什么关系?
僵哥 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 y9165102 的回复:]
关于这一位朋友说的我已经在前天晚上实验过了,但是却不行
原因在于,程序还是只返回一半的值
procedure TpostTj.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Pos('utf',urlpostxx)>0 then
urlpostxx:=utf8toansi(urlpostxx);
urlpostxx:='断'+urlpostxx;
abcxdindex.statusbar1.Panels[3].Text:='与服务器'+clientsocket1.Address+'断开连接';
end;

原因可能是还没有接收完他就结束了。。
[/Quote]
估计你可以参考我以前的处理方式(C++代码,跟Delphi差不太多的)
http://blog.csdn.net/unsigned/archive/2008/09/22/2960982.aspx
y9165102 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 unsigned 的回复:]
引用 40 楼 y9165102 的回复:
Delphi(Pascal) code
while not Terminated do
begin
if urlpostxx='' then //如果不加这一句的话会造成他自动退出整个线程.也就是无法再post下一条了
begin
try
GetMessage(MsgRec, 0, 0, 0);
TranslateMessage(MsgRec);
DispatchMessage(MsgRec);
except
Timeboolean:=True; //信号
end;
end
e…
[/Quote]

关于这一位朋友说的我已经在前天晚上实验过了,但是却不行
原因在于,程序还是只返回一半的值
procedure TpostTj.ClientSocket1Disconnect(Sender: TObject;
Socket: TCustomWinSocket);
begin
if Pos('utf',urlpostxx)>0 then
urlpostxx:=utf8toansi(urlpostxx);
urlpostxx:='断'+urlpostxx;
abcxdindex.statusbar1.Panels[3].Text:='与服务器'+clientsocket1.Address+'断开连接';
end;

原因可能是还没有接收完他就结束了。。
僵哥 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 40 楼 y9165102 的回复:]
Delphi(Pascal) code
while not Terminated do
begin
if urlpostxx='' then //如果不加这一句的话会造成他自动退出整个线程.也就是无法再post下一条了
begin
try
GetMessage(MsgRec, 0, 0, 0);
TranslateMessage(MsgRec);
DispatchMessage(MsgRec);
except
Timeboolean:=True; //信号
end;
end
else
break;
end;



如果我这…
[/Quote]
Post出去以后,就只需要等触发OnRead事件,然后在该事件当中判断是否接收完成,如果没有就不理会,后续数据到来之后会触发OnRead消息的。比如TClientSocket,本身就有一个Data属性是一个留给用户使用的指针,可以用它来缓存前面收到的数据,然后只管按数据流顺序解析HTTP协议。
y9165102 2009-01-12
  • 打赏
  • 举报
回复

while not Terminated do
begin
if urlpostxx='' then //如果不加这一句的话会造成他自动退出整个线程.也就是无法再post下一条了
begin
try
GetMessage(MsgRec, 0, 0, 0);
TranslateMessage(MsgRec);
DispatchMessage(MsgRec);
except
Timeboolean:=True; //信号
end;
end
else
break;
end;

如果我这样写的话,会接收不了返回来的值就退出了。。如果我在当中设置一个sleep(100)时间,就能接收到部份值,有人会说你可以把时间停一点,但是有的站点是很慢的,你不确定他什么时间能返回值给你,所以我现在只能在这个循环消息下手。或者有没有其他的方法可以解决这个Thread线程中用socket控制post网页的问题...
y9165102 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 38 楼 Avan_Lau 的回复:]
引用 35 楼 y9165102 的回复:
引用 34 楼 Avan_Lau 的回复:
我看了你的動畫
你用while not terminated do 循環,我認為在這后面寫任何代碼是沒有意義的。從你代碼看,我猜:你socket的開啟是在線程當中的。


嗯。如何解决?

僵哥,我在上传到优酷,等等我

改變循環條件,看你希望在什么情況下,退出這個循環,前提是線程不能終止。
[/Quote]

本来我看了上几次有一个贴子也是一样,要在当中放入判断传递过来的值,如果接受到值就不再执行此语句,但是问题是,站点的大小不一,接受的值也不一样,而且每一个站点返回信息的时间也是不相同的,还有一点就是,每一次发送的到网页的时候是分二段接收的,第一段是请求,请求完成后,你才可以发第二条信息,所以每一次他都会返回第一条的请求信息,所以不知道有没有办法让他接收完整的值后退出这个循环然后执行下面的语句。。

刚刚的视频
http://www.bokelawyer.com/images/asp.gif


金卯刀 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 y9165102 的回复:]
引用 34 楼 Avan_Lau 的回复:
我看了你的動畫
你用while not terminated do 循環,我認為在這后面寫任何代碼是沒有意義的。從你代碼看,我猜:你socket的開啟是在線程當中的。


嗯。如何解决?

僵哥,我在上传到优酷,等等我
[/Quote]
改變循環條件,看你希望在什么情況下,退出這個循環,前提是線程不能終止。
僵哥 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 y9165102 的回复:]
引用 34 楼 Avan_Lau 的回复:
我看了你的動畫
你用while not terminated do 循環,我認為在這后面寫任何代碼是沒有意義的。從你代碼看,我猜:你socket的開啟是在線程當中的。


嗯。如何解决?

僵哥,我在上传到优酷,等等我
[/Quote]
不要传了,我都访问不了的。
僵哥 2009-01-12
  • 打赏
  • 举报
回复
线程当中使用TClientSocket/TServerSocket等等几乎所有消息驱动的控件都可以按类似的方法处理,此时的Execute写法跟以往的写法是有所差别的:原来的while Not Terminated循环需要替换成上面那个GetMessage的循环,其它的所有任务递交都通过发送消息的方式来完成。消息可以通过有窗体的消息,然后在特定的窗体上面处理,也可以在GetMessage取得消息之后直接处理(不调用TranslateMessage+DispatchMessage)
y9165102 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 34 楼 Avan_Lau 的回复:]
我看了你的動畫
你用while not terminated do 循環,我認為在這后面寫任何代碼是沒有意義的。從你代碼看,我猜:你socket的開啟是在線程當中的。
[/Quote]

嗯。如何解决?

僵哥,我在上传到优酷,等等我
金卯刀 2009-01-12
  • 打赏
  • 举报
回复
我看了你的動畫
你用while not terminated do 循環,我認為在這后面寫任何代碼是沒有意義的。從你代碼看,我猜:你socket的開啟是在線程當中的。
僵哥 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 31 楼 y9165102 的回复:]
而socket创建的线程也并没有终止,很明显是没有执行下面的代码造成的错误
[/Quote]
你的Interval设置可能过小,单位是毫秒,所以,你如果要设置为1秒的话,应该要剩以1000。
僵哥 2009-01-12
  • 打赏
  • 举报
回复
[Quote=引用 30 楼 Avan_Lau 的回复:]
getMessage的返回值可能為 TRUE, FALSE, or -1. 應該要避免這樣的寫法:

while (GetMessage( lpMsg, hWnd, 0, 0)) do ...


如果返回值為 -1 這樣也會導致線程中止.
[/Quote]
GetMessage的返回值是LongBool
y9165102 2009-01-12
  • 打赏
  • 举报
回复
而socket创建的线程也并没有终止,很明显是没有执行下面的代码造成的错误
金卯刀 2009-01-12
  • 打赏
  • 举报
回复
getMessage的返回值可能為 TRUE, FALSE, or -1. 應該要避免這樣的寫法:

while (GetMessage( lpMsg, hWnd, 0, 0)) do ...


如果返回值為 -1 這樣也會導致線程中止.
加载更多回复(44)

5,391

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧