关于spcomm发送短信中的同步问题 ( 积分: 50 )

  • 主题发起人 主题发起人 sad_sand
  • 开始时间 开始时间
S

sad_sand

Unregistered / Unconfirmed
GUEST, unregistred user!
我用spcomm做短信收发,创建了两个线程SendMsg和SendAT,其中线程SendMsg进行信息发送(其中调用spcomm的WriteCommData),线程SendAT用来发送其它AT指令。主线程通过spcomm的CommReceiveData接收应答数据并进行处理。现在主线程分别与SendMsg和SendAT通过SetEvent进行了同步。
我想实现一下功能要求:
1、同步SendMsg和SendAT两个线程。
即要求这两个线程不能同时进行,若调用其中一个进程时,发现另一个进程正在运行,则等待它完成后才开始执行。
2、只能有一个SendMsg或SendAT线程。
比如正在运行SendMsg线程时,spcomm的CommReceiveData又收到数据,处理结果要调用线程SendMsg发送另一条短信息。这是要等待上次的线程调用结束后才能调用下一次SendMsg线程。
我是新手,不知该如何实现,请各位大虾给予帮助,谢谢!最好能给个简单例子。:)
 
我用spcomm做短信收发,创建了两个线程SendMsg和SendAT,其中线程SendMsg进行信息发送(其中调用spcomm的WriteCommData),线程SendAT用来发送其它AT指令。主线程通过spcomm的CommReceiveData接收应答数据并进行处理。现在主线程分别与SendMsg和SendAT通过SetEvent进行了同步。
我想实现一下功能要求:
1、同步SendMsg和SendAT两个线程。
即要求这两个线程不能同时进行,若调用其中一个进程时,发现另一个进程正在运行,则等待它完成后才开始执行。
2、只能有一个SendMsg或SendAT线程。
比如正在运行SendMsg线程时,spcomm的CommReceiveData又收到数据,处理结果要调用线程SendMsg发送另一条短信息。这是要等待上次的线程调用结束后才能调用下一次SendMsg线程。
我是新手,不知该如何实现,请各位大虾给予帮助,谢谢!最好能给个简单例子。:)
 
用windows API可以解决,2个方案:
1.
创建一个互斥体(Mutex):CreateMutex
保存它的handle,在需要同步的地方waitsingleobject,会请求mutex的所有权,如果其他
线程已经拥有所有权(mutex处于无信号状态,nonsignaled),那么代码会挂起,直到别的代码释放了mutex(ReleaseMutex),他会回到有信号状态(signaled),同步结束后,记得releasemutex 哦。
程序结束时,mutex会自动释放,不过最好显式释放,就是用closehandle 啦,呵呵
这个方法的优点是可以给mutex命名,那么就可以在进程间同步了
具体请查windows SDK
2.
如果不需要进程间同步,可以使用criticalsection,道理和mutex差不多
InitializeCriticalSection
只不过同步时使用entercriticalsection 或 tryentercriticalsection
同步结束时 leavecriticalsection
最后,mutex声明时用THandle类型,CriticalSection 用TRTLCriticalSection,都是在windows.pas里面定义的
 
其实delphi提供了自己的同步机制,我查到过,但不喜欢用,因为不够强大,用得很少所以就忘记了,呵呵,惭愧
 
后退
顶部