还是使用timer吧.
定义一个全局量:count用来计算重发次数.
定义一个全局量:Flag用来表未是否有确认信息返回private sub timer1_timer()
if flag then
timer1.enabled=false
else
count=count+1
if count=最大重试次数 then
msgbox "连接失败!"
flag=flase
timer1.enabled=false
exit sub
endif
'这里重发请求
end if
end sub如果接收到确认信息
flag=true点击连接事件:
count=1
timer1.enabled=true
定义一个全局量:count用来计算重发次数.
定义一个全局量:Flag用来表未是否有确认信息返回private sub timer1_timer()
if flag then
timer1.enabled=false
else
count=count+1
if count=最大重试次数 then
msgbox "连接失败!"
flag=flase
timer1.enabled=false
exit sub
endif
'这里重发请求
end if
end sub如果接收到确认信息
flag=true点击连接事件:
count=1
timer1.enabled=true
而upd 的难度,我觉得就是要写一个判断客户端接受的情况的,如果这里搞定了,实现起来就容易多了,我也曾经和搂主遇到过相同的问题,最后还是选择了tcp,
强烈的关注这个问题,希望高人多多指教!顶!
实际上你使用VC编写一个低端的DLL然后使用C#调用一下较好。
我以前在VC6的写法是
LONG UserTime;
UserTime = gettickcount() + 你定义的时间间隔;
然后在消息环加入
LRESULT CALLBACK ServerWinProc(HWND hWnd, UINT nMessage, WPARAM wParam, LPARAM lParam)
{
if(hWnd)
{
while(1)
{
if( PeekMessage(&msg, NULL, 0, 0, PM_REMOVE) )
{
if( msg.message == WM_QUIT )
{
break;
}
else
{
lCount = 0;
TranslateMessage(&msg);
DispatchMessage(&msg);
}
}
else
{
OnIdle(lCount);
lCount ++;
}
}
}
}
这段代码主要是当消息环一有闲暇的时间就处理时间比较。比较快速。(效率较高)
看看能不能组成C#代码。
建立一个列队,元素的结构如下:DateTime 时间 //用来记录连接开始时间
int 剩余重试次数 //用来记录剩余重试次数用空闲事件对列队顶端的元素进行检验,如果当前时间-时间>TimeOut,就创建一个控制重试的线程(为的是重试和列队检查同步进行,以免线程阻滞),注意传递剩余的重试次数。只要在重试线程中放置添加队列元素的程序段即可。OnIdle只需管处理列队元素。:-\我总觉得讲不清楚……
不知道大虾有没有看我的问题,我不太明白你说的,好象和我说的问题不是一回事啊。to piapag(噼里啪啦)
大虾所说的数据结构我已经知道了,我想问你所说的,哪个控制重试的线程怎么实现啊,而且vb 里面对于线程也不太好实现啊,大虾能不能给个例子,或者结合例子说一下啊!
不知道大虾有没有看我的问题,我不太明白你说的,好象和我说的问题不是一回事啊。to piapag(噼里啪啦)
大虾所说的数据结构我已经知道了,我想问你所说的,哪个控制重试的线程怎么实现啊,而且vb 里面对于线程也不太好实现啊,大虾能不能给个例子,或者结合例子说一下啊!
创建一个类,成员如下:Thread 线程 = new Thread( //指向内部实现函数 );
int 剩余重试次数;
string 对方地址;然后放方法:public void Retry(){ //启动线程 }线程所指向的实现函数放在类的内部作为私有函数,这样一个类的实例就能包含一个不受干涉的线程。你做要在OnIdle加入的内容可能就是这样的类 newInstance = new 类();
newInstance.剩余重试次数 = 队列元素.剩余重试次数;
newInstance.对方地址 = 队列元素.对方地址; (不好意思,刚刚的数据结构中少了)
newInstance.Retry();大概就是这样。在线程完成一个连接尝试后注意要自身销毁一下。