关于delphi下操作线程、处理并发,该怎么解决
关于delphi下操作线程、处理并发
前段时间从辞职的同事那接了一个餐饮消费的项目,硬件商有提供相应的接口,接口中有包含相应的事件,比如消费事件,比如查询余额事件,根据这些事件去和餐饮机完成交互,目前采用的方式是程序打开的时候,把相关设置(就餐时段、卡类、员工信息、就餐环境等等)保存到本地的表格,再使用一个TStringList加载关键字段,比如,我把员工信息保存到一个StringGrid中,然后把员工ID添加到对应的TStringList中,到时候直接根据TStringList获取到该员工在表格的对应行,获取其其它的信息,比如所属卡类等等,消费的时候经过一系列判断,都通过的话,把消费记录保存到本地文本,固定时间批量上传,目前遇到问题是,就餐的时候,并发数可能达到四、五十个,然后服务端运行的时候,有时候会爆出地址错误,我在事件下用try except都拦截不下来,它会直接弹出,后有打电话像硬件提供商咨询,他们说,要使用线程锁什么的,鉴于本人在线程方面的菜鸟水平,故有以下问题咨询:
1、线程中,是否可以有多函数(过程),比如我想在消费事件执行线程的某一个函数或者过程,在查询余额的时候执行另一个函数或者过程,
2、执行线程的时候,能否返回值,比如返回错误代码,以便于和设备的交互
3、线程锁,是怎么锁?
以上问题,可能会幼稚了点,但是盼望得到解答,谢谢
------解决方案--------------------
1 一个线程中可以去执行其它函数或者创建新的线程
2 线程虽然不能有返回值但是可以用加锁的全局变量实现返回值 百度synchronize
3 线程锁,这个问题有点宽泛,线程所有很多种,临界区,信号量,互斥等等,新手入门建议参考临界区,这个比较简单
InitializeCriticalSection(&cs);//初始化临界区
EnterCriticalSection(&cs);//进入临界区
............//操作代码
LeaveCriticalSection(&cs);//离开临界区
DeleteCriticalSection(&cs);//删除临界区
------解决方案--------------------
建议楼主看下delphi5开发人员手册里面的线程讲的很详细
,另外1楼回答的很好,我也是刚解决了线程的问题
------解决方案--------------------
建议LZ先找些线程方面的资料熟悉一下,才比较好理解
------解决方案--------------------
工欲善其事,必先利其器
建议楼主还是先看看可以看万一的博客,上面有多线程入门,很适合你。
------解决方案--------------------
精读《windows核心编程》第8,9章
------解决方案--------------------
你好,临界区一要防死锁(这是必须的),二要尽量减少区内代码及提高其运行效率(只要不是大循环,现在的机器性能,对此要求已不重要,但一个良好的开发习惯是重要的)。
如果,你那个事件一进入的时候进到临界区里,事件里创建的线程想进也进不去了,又退不出来,这就是死锁了。
临界区 应该 且 只应该 加在需要互斥的地方,领会并记牢。
前段时间从辞职的同事那接了一个餐饮消费的项目,硬件商有提供相应的接口,接口中有包含相应的事件,比如消费事件,比如查询余额事件,根据这些事件去和餐饮机完成交互,目前采用的方式是程序打开的时候,把相关设置(就餐时段、卡类、员工信息、就餐环境等等)保存到本地的表格,再使用一个TStringList加载关键字段,比如,我把员工信息保存到一个StringGrid中,然后把员工ID添加到对应的TStringList中,到时候直接根据TStringList获取到该员工在表格的对应行,获取其其它的信息,比如所属卡类等等,消费的时候经过一系列判断,都通过的话,把消费记录保存到本地文本,固定时间批量上传,目前遇到问题是,就餐的时候,并发数可能达到四、五十个,然后服务端运行的时候,有时候会爆出地址错误,我在事件下用try except都拦截不下来,它会直接弹出,后有打电话像硬件提供商咨询,他们说,要使用线程锁什么的,鉴于本人在线程方面的菜鸟水平,故有以下问题咨询:
1、线程中,是否可以有多函数(过程),比如我想在消费事件执行线程的某一个函数或者过程,在查询余额的时候执行另一个函数或者过程,
2、执行线程的时候,能否返回值,比如返回错误代码,以便于和设备的交互
3、线程锁,是怎么锁?
以上问题,可能会幼稚了点,但是盼望得到解答,谢谢
------解决方案--------------------
1 一个线程中可以去执行其它函数或者创建新的线程
2 线程虽然不能有返回值但是可以用加锁的全局变量实现返回值 百度synchronize
3 线程锁,这个问题有点宽泛,线程所有很多种,临界区,信号量,互斥等等,新手入门建议参考临界区,这个比较简单
InitializeCriticalSection(&cs);//初始化临界区
EnterCriticalSection(&cs);//进入临界区
............//操作代码
LeaveCriticalSection(&cs);//离开临界区
DeleteCriticalSection(&cs);//删除临界区
------解决方案--------------------
建议楼主看下delphi5开发人员手册里面的线程讲的很详细
,另外1楼回答的很好,我也是刚解决了线程的问题
------解决方案--------------------
建议LZ先找些线程方面的资料熟悉一下,才比较好理解
------解决方案--------------------
工欲善其事,必先利其器
建议楼主还是先看看可以看万一的博客,上面有多线程入门,很适合你。
------解决方案--------------------
精读《windows核心编程》第8,9章
------解决方案--------------------
你好,临界区一要防死锁(这是必须的),二要尽量减少区内代码及提高其运行效率(只要不是大循环,现在的机器性能,对此要求已不重要,但一个良好的开发习惯是重要的)。
如果,你那个事件一进入的时候进到临界区里,事件里创建的线程想进也进不去了,又退不出来,这就是死锁了。
临界区 应该 且 只应该 加在需要互斥的地方,领会并记牢。