idftp 在多线程中传小文件,老是上传不完整,丢了一些字节...不过通过延时可以解决,不过网络的上传速度不同,延时有所不同...请问各位高手有没有遇过...2

  • 主题发起人 主题发起人 hzjone
  • 开始时间 开始时间
H

hzjone

Unregistered / Unconfirmed
GUEST, unregistred user!
idftp 在多线程中传小文件,老是上传不完整,丢了一些字节...不过通过延时可以解决,不过网络的上传速度不同,延时有所不同...请问各位高手有没有遇过...200送上... ( 积分: 200 )<br />谢谢..
 
你用的是Indy几?你的代码是怎么写的?多线程上传是什么意思?一个文件分段上传?还是同时上传多个文件?最好能展示一下你的真实代码。我也用过Indy的FTP,无论文件大小上传都很正常的说。
 
zqw0117,我用的是D7自带的INDY9,我采用多线程,只是为了让界面可能不死掉...
文件不算大,所以也没有必要文件分段上传,以下是部分代码;;
//TMyThreadUp用来给处理IDFTP...
MyThreadUp:=TMyThreadUp.Create(True);
MyThreadUp.Path:=lsPath;

MyThreadUp.Host:=Trim(EdtHost.Text);
MyThreadUp.Port:=Trim(EdtPort.Text);
MyThreadUp.User:=Trim(EdtUser.Text);
MyThreadUp.Password:=Trim(EdtPassword.Text);
MyThreadUp.UpPath:=Trim(edtUpPath.Text);
MyThreadUp.Resume;

while True do
begin
Application.HandleMessage;
liBetween:=MySecondsBetween(MyThreadUp.ExecTime,Now);
if (MyThreadUp.ExecResult=ERWait)and(liBetween>=20) then
begin
SBState.Panels[1].Text:='1.文件'+lsNum+'连接超时!';

Break;
end;

if MyThreadUp.ExecResult=ERUnConnect then
begin
if Assigned(MyThreadUp) then freeandnil(MyThreadUp);
SBState.Panels[1].Text:='1.文件'+lsNum+'连接失败!';
Break;
end;
if MyThreadUp.ExecResult=ERSucceed then
begin
SBState.Panels[1].Text:='1.文件'+lsNum+'传输成功!';
Break;
end;
if MyThreadUp.ExecResult=ERFailure then
begin
SBState.Panels[1].Text:='1.文件'+lsNum+'传输失败!';Break;

end;
end;
 
问题会不会是出现在
while True do
这边....
 
你贴的代码无法看出原因,因为上传的责任不在你贴的代码里面!而且你唤醒线程后,下面的循环只是检测线程是否完成任务,而且这里是个死循环,线程不完成任务(即使超时了if (MyThreadUp.ExecResult=ERWait)and(liBetween>=20) then),线程还是会自己执行的!除非线程在上传过程中被你强行终止了,否则文件应该直到传送完毕(除非中途因为网络问题,断开了连接,只上传了一部分文件,才会出现你说的丢失字节的情况),实在看不出原因来。

另外,关于线程执行的通知,我建议你用Observer模式来写,这样会很方便也很容易维护的。我的博客上有一篇文章就是讲线程用Observer模式通知进程消息的,虽然和Indy没关系,但是我想对你理解线程的运作应该有帮助,建议你读读:
http://blog.sina.com.cn/u/5591c079010005pq
 
zqw0117,哈哈...你的解释是有点不通的...因为我上面的代码只要是为了让界面不死掉...才去用了多线程...至于while True do 这个是无关紧要的,因为
通过Application.HandleMessage;能减小CPU的使用率,不过千万不要在非主线程用它,不然出现的问题,根本是莫名奇妙的...
我已经找到原因了,不是在这个地方有问题,,..在网络好的情况下,我已经处理到不丢字节了...晚上回去用MONDEM测...一下,如果能过就OK了...

同时谢谢你的BOLG...
 
zqw0117,有写过在广域网上运行的,CS方面的应用软件?在网络很不稳定的情况下...
采用三层模式.采用MIDAS还是用NET的WEBSERVER加XML...
比较能解决网络的问题...假如当用户操作时网络断线,这时,就必须弹出提示,让用户检查网络情况,等网络通上,再继续运行..
在BS中可以得到解决,问题是客户要求一定要用CS写....
 
Indy9是没有办法实现这个的,Indy10可以,当服务器断开、或者网络被物理切断的时候,客户端发送消息或者读取消息的时候,会触发一个EIdConnClosedGracefully的异常,捕获这个异常就可以得知服务器断开,或者网络被切断了。
 
[:)]用clientsocket/serversocket做更容易。可以很方便实现检测断开。
其实用INDY也可以检测到异常断开。定时检查下上次收到数据是什么时候,
如果在1分钟内没有收到数据可以认为是断线
 
我已经解决....
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
2K
DelphiTeacher的专栏
D
后退
顶部