目前我正在编写一个关于串口收发程序,通过编写接口函数进行串口发送,随后串口会接收到一个反馈帧,发送接口函数的返回值需由串口接收到的数据是否正确决定。这个串口接收程序由一个子线程完成。主要代码如下:定义全局变量: FTW:boolean;
strTW:string;
strTWText:string;
//串口接收线程
procedure ComRecThread;
var ....
begin
.....
.....
EnterCriticalSection(CS2);
strTW:=inttohex(Recdata[4],2)+inttohex(Recdata[5],2)+inttohex(Recdata[6],2);
strTWText:=''; //这三行是对strTWText的赋值
for L:=7 to WirelessLength+7-1 do //
strTWText:=strTWText+char(Recdata[L]); //
FTW:=true;
LeaveCriticalSection(CS2);
end;
//串口发送接口函数
function TestWireless(TagID:PChar;Param:PChar):Integer;StdCall;
var Cmd:array[0..255] of Byte;
TickTime:DWord;
n,i:Integer;
str:PChar;
begin
Result:=0;
...
... FTW:=false;
if SendCom(Cmd,SendLength)=0 then //SendCom函数是往串口发送数据命令
exit;// strTWText:='aaaaa'; //这行是对strTWText的赋值 TickTime:=GetTickCount;
repeat
until (GetTickCount-TickTime>=WaitTime) or ((FTW=true) and (strTW=TagID)); EnterCriticalSection(CS2);
if (FTW=true) and (strTW=TagID) then
begin
Move(strTWText[1],Param^,length(strTWText)); //通过这句通过Param参数返回strTWText的值
Result:=1;
end;
LeaveCriticalSection(CS2);
end;
现在的问题是strTWText变量如果用接收函数中赋值代码进行赋值,函数会执行一会后产生EInvalidPointer with message "Invalid Pointer Operation"错误,若strTWText在发送函数中进行常量赋值,则会正确运行。分析原因,可能是频繁进行收发的多线程临界问题所引发的字符串赋值问题,请问,该如何进行赋值才能将内存中的值赋给另一个内存中。
strTW:string;
strTWText:string;
//串口接收线程
procedure ComRecThread;
var ....
begin
.....
.....
EnterCriticalSection(CS2);
strTW:=inttohex(Recdata[4],2)+inttohex(Recdata[5],2)+inttohex(Recdata[6],2);
strTWText:=''; //这三行是对strTWText的赋值
for L:=7 to WirelessLength+7-1 do //
strTWText:=strTWText+char(Recdata[L]); //
FTW:=true;
LeaveCriticalSection(CS2);
end;
//串口发送接口函数
function TestWireless(TagID:PChar;Param:PChar):Integer;StdCall;
var Cmd:array[0..255] of Byte;
TickTime:DWord;
n,i:Integer;
str:PChar;
begin
Result:=0;
...
... FTW:=false;
if SendCom(Cmd,SendLength)=0 then //SendCom函数是往串口发送数据命令
exit;// strTWText:='aaaaa'; //这行是对strTWText的赋值 TickTime:=GetTickCount;
repeat
until (GetTickCount-TickTime>=WaitTime) or ((FTW=true) and (strTW=TagID)); EnterCriticalSection(CS2);
if (FTW=true) and (strTW=TagID) then
begin
Move(strTWText[1],Param^,length(strTWText)); //通过这句通过Param参数返回strTWText的值
Result:=1;
end;
LeaveCriticalSection(CS2);
end;
现在的问题是strTWText变量如果用接收函数中赋值代码进行赋值,函数会执行一会后产生EInvalidPointer with message "Invalid Pointer Operation"错误,若strTWText在发送函数中进行常量赋值,则会正确运行。分析原因,可能是频繁进行收发的多线程临界问题所引发的字符串赋值问题,请问,该如何进行赋值才能将内存中的值赋给另一个内存中。
解决方案 »
- 关于clientdateset的继承问题
- 请问:在WINXP的添加组件中没有证书服务吗?怎么找不到啊?
- 发布一个小工具,欢迎大家帮忙测试:)
- 怎么从一个buf中拷贝出我要的字符窜?
- 大虾!!我用了IActiveDesktop接口进行编程,为什么编译的时候,显示"类没有注册"呢???
- 各位那里有关于Delphi链表操作的详细资料,望告知?谢谢.100相送:)
- 提问:哪里有installshield下载?
- 向各位大侠请教:用Delphi实现动态创建Foxpro表,当字段名为中文时会出问题!急!急!
- 如何在运行时动态创建计算字段,并在创建时输入计算公式
- 在Delphi中如何对变量进行规范的命名?
- 关于corba问题
- 关于.BPL文件使用的问题
{
FTW:=false;
if SendCom(Cmd,SendLength)=0 then //SendCom函数是往串口发送数据命令
exit;// strTWText:='aaaaa'; //这行是对strTWText的赋值
}从代码来看,你是在线程的EXECUTE()方法里对全局变量进行赋值吧。
全局变量属于线程外的东西,相当于认为它属于主线程管理。因此,这儿存在一个线程同步的问题了。
你用了临界区进行同步,但你同步的方法不正确。你应当调用同步方法来实现线程同步。
同步的方法,你可以看看 "线程同步" 相关的资料。我就不在这儿写代码了。:),你Google一下,很多.