多线程程序中非主线程主要来完成什么样的事情?????????

何鲁青 2005-04-13 05:10:39
在做一个设备的监控程序,想要把定时轮询设备参数的操作用多线程来实现,有几个疑问,希望高手执教:(以前没写过多线程的东西,我是菜菜菜菜鸟,请高手给出“傻瓜式”的解答,否则我会看不懂的,嘿嘿……)
1、线程中Excute函数执行完毕是不是就自动地退出并销毁这个线程那?如果不是,怎么操作才能销毁这个线程那?如果不销毁线程有没有什么不良影响?

2、我做轮询就是打算从一个数据库中顺序读取数据(设备编号、设备类型、设备所在IP地址等通信必须的参数)然后调用查询函数向各个设备发送查询信息,设备得到查询命令之后会像我发送最新的设备参数,我的接受在主线程中完成的,主线程接到数据之后,根据设备编号之类的数据去更新数据库,所以,这个数据表就是多个县城公同操作了,那么我需要做什么来保证数据的一致性?

3、我还想得到网络连接的状况,所以,我想在每个查询命令发送出去之后打开一个计时器timer,如果超过设定的时间,就报错,注意我市每个设备的一条查询发出的时候都加一个定时器,这样的话,我会开很多的Timer那么当一个定时器到时间的时候,我怎么判断那个设备超时了那?有什么好的办法能够区分马?

呵呵,问题很菜,希望大家不吝赐教....小河拜谢了
...全文
223 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
何鲁青 2005-04-25
  • 打赏
  • 举报
回复
最近没上来,发现还有一个帖子没有结,呵呵,这两天开始好好看了看多线程的东西,发现这个地方也没有什么神秘的,胆大心细就好了,呵呵,我的功能基本上实现了,今天没事,顶着帖子出来喘口气...
不过delphi的错误提示也真够搞笑的,今天有一个操作数据库的语句用到parameter来传值,搞了半天老提示我参数越界,改来改去不知道怎么回事,后来发现我的数据表的名字的第一个字母是数字,于是前面加上一个T,接着就一切正常了,唉~~~~~~~~~~有时候数据库中字段名用到了保留字也会出这种提示,写出来,和大家分享...
何鲁青 2005-04-16
  • 打赏
  • 举报
回复
果然sleep对于Timer是有影响的;
qin_wei 2005-04-15
  • 打赏
  • 举报
回复
用sleep不会阻塞主线程的运行。
你的子线程到底要用来做什么的?
如果用来收数据,加sleep的话会影响接收的效率,关于tcp通讯网上有很多现成的代码,可以用不用的模型实现,自己找找吧,比如wsaeventselect,iocp等
何鲁青 2005-04-15
  • 打赏
  • 举报
回复
upup....
进来看看,帮忙定义下哈...
何鲁青 2005-04-15
  • 打赏
  • 举报
回复
非主线程中用sleep来延时一段时间好不好那?
还是用GetTickCount函数比较好一些
我知道sleep是把CPU让出去,是不是这时候主线程的CPU也让出去了?
不知道我理解的对不对...
qin_wei 2005-04-15
  • 打赏
  • 举报
回复
sleep对于新建线程里面的Timer控件应该有影响吧,当sleep时候,到达的timer将不被触发,该次timer事件丢失,我猜的啊,好像以前试过是这样,你再自己试验一下。
何鲁青 2005-04-15
  • 打赏
  • 举报
回复
Up...
何鲁青 2005-04-15
  • 打赏
  • 举报
回复
我用的UDP,程序开始的时候主程序将数据库中的设备列表读取到一个共享的存储区内,然后创建这个新的线程,这个新线程就从那个共享存储区中取出数据,然后依次的发送查询命令,参考了你的方法,在共享存储的表里面用一个字段来记录发送之后经过的时间。
现在就是发送在新建线程里面,接受是在主线程完成的,既然sleep不影响主程序的运行,那我就可以放心的使用了。
不知道sleep对于新建线程里面的Timer控件的计时又没有什么影响?
何鲁青 2005-04-14
  • 打赏
  • 举报
回复
qin_wei(烤毛蛋) 老大估计是个VC高手...
beyondtkl 2005-04-14
  • 打赏
  • 举报
回复
悄悄的做某些事

比如 挣大钱,娶美女
qin_wei 2005-04-14
  • 打赏
  • 举报
回复
2、一般不会有冲突吧,没接触过。
qin_wei 2005-04-14
  • 打赏
  • 举报
回复
晕,第3个还用解释吗,自己动脑想一一下啊
int counter[100];//每个初始化为-1
void onTimer(...)
{

int i;
for(i=0;i<100;i++)
{
if(counter[i]!=-1)//-1作为该counter是否开始记数的标志
{
counter[i]++;
if(counter[i] >timelimit)
{
//结束第i个任务
}
}
}
}

如果正常的通讯结束,把对应的counter[?]=-1就得了
}
何鲁青 2005-04-14
  • 打赏
  • 举报
回复
2、每条纪录有一个唯一的id,发过去时候把 id带过去,收回来时候根据id更新库。
-----------这个我知道,主要是担心同一条记录,有的线程在读,有的线程再写,会不会有问题,access应该会有机制来防止脏数据的八...
何鲁青 2005-04-14
  • 打赏
  • 举报
回复
3、一个time,对应多个记数器,记数器满了就到超时了。
----------------这个怎么来做???????????
何鲁青 2005-04-14
  • 打赏
  • 举报
回复
嘿嘿嘿,看到了,我刚才理解错了....谢谢谢谢
qin_wei 2005-04-14
  • 打赏
  • 举报
回复
怎么是所有记数都加1呢?
你发第一条纪录后将counter[0]设置成了0,以后每秒这个counter都加1
但counter[99]的值是-1,在timer事件触发的时候它根本不会被加值

if(counter[i]!=-1)//-1作为该counter是否开始记数的标志

即使你100秒后才对最后一个设备发的查询命令,那时才把counter[99]设置为0
何鲁青 2005-04-14
  • 打赏
  • 举报
回复
up一下,每条记录分配一个timer的话,占用的资源应该是很可观的吧,但是我又想记录每个设备的廉洁状况,以便于在超时的时候及时地发出告警,该怎么做?有什么好的办法〉....
进来的兄弟们都帮忙给顶一下...
何鲁青 2005-04-14
  • 打赏
  • 举报
回复
qin_wei(烤毛蛋)你的方法我想过,但是我有很多的记录,我发送查询命令的时候开始记录时间,如果想你那么做的话,有可能计时不准确,比如我发送第一条记录的查询命令和发送最后一条查询命令之间有可能间隔1到2秒,这时候再用你的方法,每次给所有记录都加1,好像就不好了....
qin_wei 2005-04-13
  • 打赏
  • 举报
回复
1、函数执行完毕就是就自动地退出销毁了,不销毁的话线程月来越多,cpu 越来越慢,cup就销毁了、
2、每条纪录有一个唯一的id,发过去时候把 id带过去,收回来时候根据id更新库。
3、一个time,对应多个记数器,记数器满了就到超时了。
dxhdxh 2005-04-13
  • 打赏
  • 举报
回复
作你自己认为要分开同时要作的

16,748

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧