我有这样一个系统:后台有一个线程从串口中读取每个点的数据,分析完成后在主界面上显示,同时主界面上针对每一个点都采用动态生成控件的方式,我在主窗口中定义了一个过程(A)用于修改数据,主要由线程调用,同时主界面有刷新功能(B),一旦刷新将把所有的动态控件重新生成,此时不允许调用A。
我使用的是
CreateMutex--一次性WaitForSingleObject--——P
ReleaseMutex-------VCloseHandle--一次性
等方法实现互斥
但现在好像我每次调用B方法刷新时发现A方法也在运行,为什么呢?
我使用的是
CreateMutex--一次性WaitForSingleObject--——P
ReleaseMutex-------VCloseHandle--一次性
等方法实现互斥
但现在好像我每次调用B方法刷新时发现A方法也在运行,为什么呢?
while Fusing do ;
FUsing := true;
......
Fusing := False;
while Fusing do ;
FUsing := true;
......
Fusing := False;和互斥量不是一样的吗?
CreateMutex--一次性WaitForSingleObject--——P
ReleaseMutex-------VCloseHandle--一次性
关键是现在好像没有起作用
我是在A和B的开始均调用P,结束时调用V的。
来个偏方吧:
利用操作系统的消息队列排队处理,
要执行A或B之前,都发个相同ID的Message,假设lParam = 1 为A,假设lParam = 2 为B,
在回调函数里处理A或B。
发消息好象只能用POSTMESSAGE才能到消息队列中!
比如
var
bflag:boolean;A:
while bflag=false do //如果在执行B则等待
begin
sleep(1);
application.processmessage;
end;
bflag:=true;...
B:
while bflag do //如果在执行A则等待
begin
sleep(1);
application.processmessage;
end;
bflag:=false;
...
var cs:TRTLCriticalSection;
...
InitializeCriticalSection(cs);
...
EnterCriticalSection(cs);//进入临界区
-语句
LeaveCriticalSection(cs);//临界区结束
...
DeleteCriticalSection(cs);