首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

线程间隔执行的有关问题

2012-03-06 
线程间隔执行的问题!我想用线程实现这一功能:服务器端向客户端发送数据包,在服务器端的发送列表中把数据包

线程间隔执行的问题!
我想用线程实现这一功能:
  服务器端向客户端发送数据包,在服务器端的发送列表中把数据包按顺序排好号,当客户端接收到的数据包的包序正确的时候就处理数据,当不正确的时候就先把错误的数据包存起来,同时发送一个信息给服务器端,告诉服务器端自己需要的包的序号,服务器端就把这个序号的数据包在发送列表上做个标记,每隔一段时间就检测一下发送列表,看有哪些数据包是做了标记的,然后补发;这个过程我想用线程完成,也就是补发数据用线程完成;
  我想问的是:1.这个“每隔一段时间就检测一下发送列表”怎么实现???不用TTimer
  2.线程的执行过程究竟是怎样的?详细的过程。
  3.我应该怎么释放线程。
  4.我试着用线程执行补发,可他只能补发一两个包,后来虽然我resume这个线程了,但是他却不执行。

[解决办法]
简单点说,用信号量。通过“产生SetEvent,释放ResetEvent”来管理线程间相互制约的通讯。
你的问题1,如果连你也不确定线程作用的时间间隔,那么用timer有什么意义呢?你只能等待线程A的某个事件触发再启动线程B。问题2,问题谈细了还是去看操作系统原理。
问题3,Terminate可以终止线程运行,如果你线程运行之前就设定FreeOnTerminate = true,那么将在线程终止时自动释放资源。
问题4,resume启动不了线程原因很多,例如,你的线程资源根本不存在,或者,由于线程优先级、线程同步等问题导致线程被堵塞。
总之,需要对线程间的作用关系进行严格管理,重要的一点就是我开始说的信号量。当然,还有更多其他的管理手段需要去学习了。
[解决办法]
不用TTimer,可以在线程执行体中直接用Sleep:
void __fastcall TMyThread::Execute()
{
while(!Terminated)
{
//在此扫描列表,并发送
Sleep(5000);//每隔5秒来一次
}
}

释放线程:一般是在线程设置FreeOnTerminate为true,这样只要执行体(就是Execute函数)走到return后线程就自动释放。
__fastcall TMyThread::TMyThread()
: TThread(true)
{
FreeOnTerminate = true;
}
[解决办法]
PostThreadMessage是利用消息队列,队列属于异步处理机制,即需要处理程序主动从队列中获取消息进行处理。

SendMessage是同步消息调用,类似WndProc函数,消息只有被处理完毕返回,发送消息一方才继续执行,类似函数调用。

所有的用户线程的优先级都差不多,不会高于系统线程的优先级,编写线程中很少需要设置线程的优先级。
线程的优先级类似数据结构中的优先队列,即优先级高的线程执行的时间片越多,但运用不好,就会出现其他线程饥饿。

另外一个线程如果访问一个已经Lock的对象,则会死等,不会有返回。

热点排行