delphi dll中使用临界区的问题
我的项目是使用delphi的dll库封装一个串口函数包,界面程序(也是delphi编写)调用我的dll库,对硬件设备进行操作。
dll中我新建一个点名的线程,主要负责自动通过串口对硬件设备进行点名,因为要和其他功能函数(也通过串口)同步,使用了
临界区,大概的代码如下:
var
lockSpace:TCriticalSection;//全局临界区对象
//初始化dll全局变量函数
begin
lockSpace := TCriticalSection.Create;//临界区对象的创建
end;
//新建点名线程的execute,其中使用了临界区,QueryLoopInfo等函数通过串口和下位通讯!!!!!
Procedure TCallingTThread.Execute;
Label NEXTLOOP;
var
address:byte;
i:integer;
p_Loop:PLoopInfo;
begin
if (not assigned(LoopList)) or (LoopList.Count=0) then runTThread:=false;//如果回路链表未初始化并赋值,退出线程
CoInitialize(nil);
//循环点设备
i:=0;
while runTThread do
begin
lockSpace.Enter;//进入临界区
if i = Looplist.Count then i:=0;//链表结尾,重新开始
p_Loop:=Looplist.Items[i]; //获取设备信息记录
FillChar(RGlobalBuf,Sizeof(RGlobalBuf),0);//清空收发全局变量
address:=strtoint(p_Loop.Loopid);
if p_Loop.ShieldFlag then goto NEXTLOOP;
case address of
1..80:QueryLoopInfo(p_Loop);//发送串口命令!!!!!
81:QueryIndicatorLight(p_Loop));//发送串口命令
82..85:QueryPrediction(p_Loop));//发送串口命令
end;
if p_Loop.QueryLoopFault then
begin
QueryLoopFault(p_Loop));//发送串口命令
p_Loop.QueryLoopFault:=false;
end
else
RLoopState.LoopStateInfo[address].FaultList:=[];
// if RLoopState.LoopStateInfo[address].FaultList <> [] then
ComOperation.ResumeAlarm(address); //故障回复判断,并修改故障记录的故障回复时间
if p_Loop.QueryLightFlag then
begin
QueryLoopLight(p_Loop);
p_Loop.QueryLightFlag:=false;
end;
NEXTLOOP:
lockSpace.Leave;//离开临界区
inc(i);
SleepEx(2,TRUE);
end;
CoUninitialize();
end;
//主机下载指示灯盘,返回值:其他-通讯成功,返回标识码 2-命令发送失败 3-命令接收失败 4-无此回路地址
//界面程序调用的dll功能函数,也通过串口对设备进行操作,同样使用了临界区!!!!
function SetIndicatorLight(const Loopaddress:string;const data:array of byte):integer;
var
i,j:integer;
p_Loop:PLoopInfo;
begin
// lockSpace.Enter;//进入临界区
p_Loop:=ComOperation.QueryLoopList(Loopaddress);//查询回路节点信息
if p_Loop= nil then
begin
// lockSpace.Leave;//离开临界区
result:=4;
exit;
end;
lockSpace.Enter;//进入临界区
j:=length(data);
with RGlobalBuf do
begin
//数据赋值
writeLen:=j+8;
factWriteLen:=0;
readLen:=0;
factReadLen:=0;
sData[0]:=strtoint(Loopaddress);
sData[1]:=170;
sData[2]:=85;
sData[3]:=byte((j+1) shr 8);
sData[4]:=byte(j+1);
sData[5]:=112;
for i:=0 to j-1 do sData[6+i]:=data[i];
ComOperation.ComEfficacity(true,sData[j+6],sData[j+7]);
end;
//数据处理
result:=DealInceptData.DealSetIndicatorLight(ComOperation.OrderSendFunction(p_Loop.LoopComHandle));//发送串口命令
lockSpace.Leave;//离开临界区
end;
我的目地是同一时间只用一个dll中的功能函数对串口操作收发命令,可执行结果还是出现了串口数据乱码!请大家指点一下我的思路对不,有何改进意见?