在线程中用 Application.ProcessMessage 的问题(100分)

  • 主题发起人 主题发起人 QSmile
  • 开始时间 开始时间
Q

QSmile

Unregistered / Unconfirmed
GUEST, unregistred user!
在线程中用 Application.ProcessMessage 的问题

是这样的。
我在一个线程中,
要调用一个函数,这个函数是一个连接函数,调用后马上返回,但这时,连接可能还没有完成。(当然也可以永远完成不了),我在控件的 OnConnected 事件中设 bConnected := true;

简要代码如下:
// 线程体
dwTime:= GetTickCount;
net.connect; // 连接
while GetTickCount - dwTime < dwTimeOut do
begin
Application.ProcessMessage;
if bConnected then
break;
end;
// to some thing....


////
net.Connected 中
bConnected := true;

这种方法在窗体下时是没有问题的,但我用到了线程中,这种方法是否可行?

因为 ProcessMessage 是检查窗体事件,而用在 thread 中。它能不能处理 thread 中的其它事件?
 
好像可以,我在系统中运行,确实节省了cpu时间,也解开了界面假死状态
 
两个字:多余
 
三楼对的,最好先了解一下,什么时候该用到多线程,用了多线程以后可以带来哪些影响。
 
你们好象没有明白我的意思。
 
根据题目分析:明白的地方是 .连接应该是异步的(不然不会这样写代码)
不明白的 .线程中Application.ProcessMessage好像不会起什么作用,
(Application.ProcessMessage只会要求主窗体处理消息队 列中的信息)
不如超时后发送超时消息给主线程,成功发成功消息给主窗体
 
还真是够多余的,既然是多线程的,你需要调用主线程来更新界面么?
 
这样说吧。

一个 tcp 的控件。我要用它完成 FTP 上传/下传
如:TClientSocket

你连接服务器。是在它的 OnConnected 里表示连接完成否。

你发一个命令 是在它的 OnData 里得到服务器的回答。

但我要把这一切都写在一个线程里。想用多线程上传/下传。同时传多个文件。

处理过程是个很过程的。不能用消息来触发了。因为线程里没有接受消息的地方。

如:
连接 --> 完成否? -> 发送命令1 -> 接收回答 -> 是否正确? -> 发送命令2 -> 接收回答


那我想看看你们是如何处理的?
 
的确多余
 
while not Terminated do
begin
Sleep(1);
//FConnectState 连接状态 0:连接断开 1:正在连接 2:连接成功
if FConnectState =0 then
begin
FConnectState := 1;
FOwner.RefreshSocket; //重新连接服务器
Continue;
end;

if FConnectState = 1 then Continue;

if FOwner.FNewCommand then //需要发命令
begin
//ssendcmd
end;

if not FOwner.FNewRead then Continue; //没有收到数据
//收到数据的处理
end;
然后在onconnect中把fconnected:=2,ondisconnect中把fconnected:=1就应该可以了
 
我们的处理方法不一样。

不想说谁好谁不好。
 
回来细细想了下
由 dreamfly_wu 的方法想到个更好点的。

他的方法就是有太多的状态要判断了。

写一个 ReadData();
 
简单:使用TNotification(外部)或事件(线程内部)
 
多人接受答案了。
 
后退
顶部