***在线求救:关于线程超时的问题?***
我的问题是在调用一个API函数的时候,
例如WNetAddConnection2这个函数可能需要很长时间才返回结果
如何在给定的时间内,如何没有返回结果则停止.
procedure MyThread.Execute;
var
NRW: TNetResource;
Res: Dword;
restr:string;
begin
with NRW do
begin
dwType := RESOURCETYPE_ANY;
lpRemoteName := pchar('\\'+nowip+'\ipc$');
lpProvider := '';
end;
FreeOnTerminate :=true; //设置线程终止许可
Res := WNetAddConnection2(NRW, '', 'administrator', CONNECT_UPDATE_PROFILE);
//大家注意就是上面这个函数有时需要很长的时间才返回!
if Res = No_Error then
begin
WNetCancelConnection2(NRW.lpRemoteName, CONNECT_UPDATE_PROFILE,true);
Synchronize(GiveAnswer);
end
end;
以上是用线程类的方法,可以设置超时吗?如何设置????
另外:如何用API来创建线程的方法如何解决上面的问题?
请各位高手不吝赐教!(最好有源代码)
ps:我比较穷,给的分数不多,请原谅
问题点数:0、回复次数:6Top
1 楼701701()回复于 2004-09-04 12:34:39 得分 0
高手啊,高手,你在哪里啊?Top
2 楼qinmaofan(采菊南山下【抵制日货】)回复于 2004-09-05 09:34:09 得分 0
我的一点提示,没经过测试。
把可能会耗时比较长的函数放在一个线程中执行,比如是mythread。
然后在调用的地方:
mythread:= Tmythread.create(false);
mythread.freeonterminate:=true;
mythread.resume;
WaitForSingleObject(mythread.handle,2000); //等待线程执行完毕,如果超过2秒钟就返回。
Top
3 楼701701()回复于 2004-09-07 09:44:36 得分 0
谢谢上面这位朋友
WaitForSingleObject 好像一定要有对象的句柄才能控制
而WNetCancelConnection2是没有句柄的啊!
上面这位朋友用到了自身线程的句柄
思路不错,谢谢,
但是可能不会成功,
我的想法是将WNetCancelConnection2放入一个子线程中
WaitForSingleObject指向子线程的句柄
不知道那位高手可否解决这个问题
最好有源代码
谢谢
Top
4 楼man8888(北京男人)回复于 2004-11-09 14:06:03 得分 0
我建议创建一个TTestThread来监视这个MyThread,并在MyThread线程中添加一个PassTime:DWORD;属性,当现成MyThread.Resume时开始计时,而在TTestThread线程的While循环中不断GetTickCount然后从PassTime时间减去,如果超过指定毫秒数则超时!TTestThread的循环需要加入适当的Sleep语句。Top
5 楼701701()回复于 2004-11-12 08:17:04 得分 0
谢谢man8888(北京男人)
我的考虑是:
即使终止超时连接线程
但是我也无法验证终止了线程就可以终止WNetCancelConnection2这个函数的执行
我担心的是,window在执行完WNetCancelConnection2才终止这个线程
也就是说即使线程终止了,函数还是要执行的
而这一点是无法验证的!!!!Top
6 楼tigerii(tigerii)回复于 2004-11-12 14:42:37 得分 0
701701 is a good software person with abilityTop




