为什么在线程中调用时间控件会不执行呢? 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;
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;
解决方案 »
- 如何区分普通串口还是usb转串口
- 请问Inno setup script 中用CODE中的函数修改windows 系统环境变量后如何立即生效?
- delphi 里怎样么实现粘贴功能,或着模拟键盘Ctrl+V
- 调用Handle函数系统报错,可已经在USES中加入了Windows
- 李维《新书VCL inside》附书源码
- 自己创建的Hintwindow如何才能响应鼠标点击?
- 数字字段保留小位数?
- 为什么我的query.open 后,就不能append,总是提示不能修改一个 read-only dataset,how to?
- 散全部的可用分请教问题!!
- delphi制作媒体播放器的若干问题?
- 数据校验问题(上一帖错误结贴)
- fastreport 問題啊。救急啊。要交工程,好可憐,有哪位會啊。幫幫忙啊
应该在Form1下启动线程
var
thread1: Tkk;
thread1 := Tkk.Create(False);
这样就执行Tkk.Execute
http://topic.csdn.net/u/20081218/15/28716f7e-d780-4384-a148-c354d85866ce.html
TranslateMessage(MsgRec);
DispatchMessage(MsgRec)
end;VCL消息处理^_^
改为线程的私有变量
在线程创建时,对Time的事件赋值
如果在一创建线程的时候就创建Time的话会出现以下问题
constructor Taa.create;
begin
Time:=TTimer.Create(nil); //主要是在创建线程时创建时钟。。要不然可能无法执行他
Time.Enabled:=false;
Time.OnTimer:=TimerProc;
Time.Interval:=1;
FreeOnTerminate := True; // 自动删除
inherited Create(False); // 直接运行
end;
onTime事件当中就会出现无法将其停止。。
procedure Taa.TimerProc(Sender: TObject);
begin
Time.enabled:=false; //让他时钟控件只执行这一次 问题出在这里,如果是开始创建这里就会报错
form1.memo1.lines.add('aa');
end;
执行处代码
procedure Taa.Execute;
begin
Time.Enabled:=True;
end;
而僵哥的这一个我不知道怎么用呀procedure TMyThread.Execute;
begin
FTimer:=TTimer.Create(nil);
try
FTimer.Enabled:=false;//需要用的时候Enabled设置为True即可。
FTimer.OnTimer:=TimerProc;
while GetMessage(MsgRec, 0, 0, 0) do begin
TranslateMessage(MsgRec);
DispatchMessage(MsgRec)
end;
Terminate;
finally
FTimer.Free;
end;
end;不知道的原因是,你这里只是设置了一个消息循环。可是时钟却并没有执行呀。。
var
Msg: TMsg;
begin
FTimer:=TTimer.Create(nil);
try
FTimer.Enabled:=True;
FTimer.Interval:=5000 ;
FTimer.OnTimer:=TimerProc;
while GetMessage(Msg, 0, 0, 0) do begin
TranslateMessage(Msg);
DispatchMessage(Msg)
end;
Terminate;
finally
FTimer.Free;
end;
{ Place thread code here }
end;
你在构造函数中创建Timer,相当于你在主线程中创建的Timer!
//看看线程类的封装FHandle := BeginThread(nil, 0, @ThreadProc, Pointer(Self), CREATE_SUSPENDED, FThreadID);@ThreadProc为回调函数function ThreadProc(Thread: TThread): Integer;
begin
try
if not Thread.Terminated then
try
Thread.Execute;//从这里可以看出,只有Execute中执行的东西才有堆与栈(TLS),并且系统为该线程创建一个单独的消息队列,通过Getmessage与Dispatch来分发,派送消息,这样的话,在时钟到期时,就会向该线程队列发送一个WM_TIMER消息,并由在线程中实现的消息处理器来接收!
except
end;
var
i:integer;
begin
for i:=0 to memo1.lines.count-1 do //这里本来有三条信息,应该要循环三次的
begin
FTimer:=TTimer.Create(nil);
try
FTimer.Enabled:=true;//需要用的时候Enabled设置为True即可。
FTime.Interval:=1;
FTimer.OnTimer:=TimerProc;
while GetMessage(MsgRec, 0, 0, 0) do begin //当我像这样写入后,当FTimer返回值后,线程就全部退出,
TranslateMessage(MsgRec); //不再执行for循环了,,这是为什么呢
DispatchMessage(MsgRec)
end;
Terminate;
finally
FTimer.Free;
end;
end;
end;
FTime.Interval:=1;
FTimer.OnTimer:=TimerProc;
FTimer.Enabled:=true;//这里再恢复。
TranslateMessage(MsgRec); //不再执行for循环了,,这是为什么呢
DispatchMessage(MsgRec)
end; 那么为什么当消息执行完后,他后面的那些代码就不会执行了呢?
如果程序沒有對此線程投遞消息,那么,你的消息循環處理并不會被處理,直接執行了線程的terminate
已经投递过去,而且也执行了。。但他就是不执行下面的代码
僵哥,我不知道怎么说得清楚,所以刚刚去整个动画。麻烦你看看是什么原因
http://mm.nishishu.cn/123/mm/aa/untitled.swf希望这样看你能明白我说的,我的表达能力不好,,
如果返回值為 -1 這樣也會導致線程中止.
你用while not terminated do 循環,我認為在這后面寫任何代碼是沒有意義的。從你代碼看,我猜:你socket的開啟是在線程當中的。
本来我看了上几次有一个贴子也是一样,要在当中放入判断传递过来的值,如果接受到值就不再执行此语句,但是问题是,站点的大小不一,接受的值也不一样,而且每一个站点返回信息的时间也是不相同的,还有一点就是,每一次发送的到网页的时候是分二段接收的,第一段是请求,请求完成后,你才可以发第二条信息,所以每一次他都会返回第一条的请求信息,所以不知道有没有办法让他接收完整的值后退出这个循环然后执行下面的语句。。刚刚的视频
http://www.bokelawyer.com/images/asp.gif
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网页的问题...
关于这一位朋友说的我已经在前天晚上实验过了,但是却不行
原因在于,程序还是只返回一半的值
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;原因可能是还没有接收完他就结束了。。
http://blog.csdn.net/unsigned/archive/2008/09/22/2960982.aspx
嗯~我写了一个后台管理器。就是当我有新的文章发布的时候。可以同时发布到其他的网站上去。具体实现功能
循环取得一条值
然后开始POST到我要发布的网页(用socket)
就是这么简单的功能
第一个任务都有一个标识,比如
然后开启有限的几个线程,线程从任务列表当中取得任务,根据任务标识进行处理。对于检查任务,则仅在接收信息完成之后直接生成更新任务,这个相对是比较简单的;对于更新任务,则可能对于socket的处理就要分为两步,第一步是Post,Post结束(HTTP信息发送结束),会有相应的服务器给出的确认包,在收到确认报文之后接着转到第二步,生成一个Get请求并发送出去,然后接收Get应答。当这两步完成之后,就可以继续接任务列表当中读取未处理的任务。
begin
GetMessage(MsgRec, 0, 0, 0);
TranslateMessage(MsgRec);
DispatchMessage(MsgRec);
Sleep(1000);
end;改变循环方式可以吗?不过有的地址只返回</script>之类的信息就没办法。。哎
...//创建所须的对象实例
while GetMessage(MsgRec, 0, 0, 0) do begin
TranslateMessage(MsgRec);
DispatchMessage(MsgRec);
end;
至于什么Sleep啥的都不需要。然后只在相应的事件,包括OnRead,以及异常处理的OnError及OnDisconnect当中进行处理。如果怕返回的信息是比较特殊的情况,那么可以设置HTTP头信息Connection: closed,即当HTTP交互完毕,即由服务器来主动断开连接,从而触发OnDisconnect事件,触发相应的异常处理。
begin
TranslateMessage(MsgRec);
DispatchMessage(MsgRec);
if (Pos('</html>',urlpostxx)>0) or (Pos('接受错误',urlpostxx)>0) then Break;
end; 哎,用笨人的方法。。不过还是解决了。
begin
TranslateMessage(MsgRec);
DispatchMessage(MsgRec);
if (Pos(' </html>',urlpostxx)>0) or (Pos('接受错误',urlpostxx)>0) then Break;
end;如果不加if 那么当他接收完值后,他就会终止线程。。
Socket: TCustomWinSocket);
begin
index.statusbar1.Panels[3].Text:='与服务器'+clientsocket1.Address+'成功建立连接';
dosmemo.Lines.Add('与服务器'+clientsocket1.Address+'成功建立连接');
Socket.SendText(headbuff);
Socket.sendtext(contentbuff);
end;procedure TpostTj.ClientSocket1Connecting(Sender: TObject;
Socket: TCustomWinSocket);
begin
index.statusbar1.Panels[3].Text:='正在与服务器'+clientsocket1.Address+'建立连接';
dosmemo.Lines.Add('正在与服务器'+clientsocket1.Address+'建立连接');
end;procedure TpostTj.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
index.statusbar1.Panels[3].Text:='正在接收数据';
urlpostxx:=urlpostxx+socket.ReceiveText;
if Pos('utf',urlpostxx)>0 then
urlpostxx:=utf8toansi(urlpostxx);
dosmemo.Lines.Add(urlpostxx);
end;procedure TpostTj.ClientSocket1Error(Sender: TObject;
Socket: TCustomWinSocket; ErrorEvent: TErrorEvent;
var ErrorCode: Integer);
begin
ErrorCode:=0; //注意这一句是屏闭错误的关键;
urlpostxx:='接收错误';
index.statusbar1.Panels[3].Text:='无法与服务器'+clientsocket1.Address+'建立连接';
dosmemo.Lines.Add('无法与服务器'+clientsocket1.Address+'建立连接');
end;
我这里是这样写的。。你认为怎么改一下呢?
http://topic.csdn.net/u/20081114/11/091305bd-24cf-4c5c-9083-3993e4d98eae.html