使用线程读取采集卡数据,为何不能随所采集设备的信息变化而变化?

liuhuan992 2009-08-08 04:01:15
小弟近来使用PCI采集卡对外部传感器进行数据采集并使用CHART绘制曲线图,
在使用窗体中实时采集时,所绘曲线图能够随传感器的受外界感应而发生变化,
但将此方法转移到线程中使用时,使用线程数据采集,后调用主窗体中的CHART控件进行曲线绘制。
所绘制的曲线却是一条直线,没有任何变化,

请教各位老大,这是为何?
...全文
137 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuhuan992 2009-08-10
  • 打赏
  • 举报
回复
先谢过各位老大,
此处问题我已找到,
是我的 strvalue:=format('0.00',[voltageval]);
这个语句未正确使用,
应为:strvalue:=formatfloat('0.00',[voltageval]);
这样即可得出正确曲线.
wxsan 2009-08-09
  • 打赏
  • 举报
回复
顶!~~
sanguomi 2009-08-08
  • 打赏
  • 举报
回复
你可以先不用线程调试,把那函数在外边调试,看有没问题
JohnYale 2009-08-08
  • 打赏
  • 举报
回复
你在调试的时候,voltageval改变吗?
liuhuan992 2009-08-08
  • 打赏
  • 举报
回复
此处为thread部分代码
主窗体部分只有三个控件,一个是BUTTON,一个CHART,一个CHECKBOX,
其中BUTTON的CLICK事件中创建了一个p8696therad的线程,


procedure p8696therad.giveseries;
begin
form1.series1.add(strtofloat(strvalue)); ///绘图
form1.series1.RefreshSeries;

end;
procedure P8696therad.Execute;
var deviceID:word;
hdevice:integer; //设备句柄
breturnstatus:boolean; //返回状态值
readsizewords:integer; //接收字符串长度
nchannelcount:integer; //通道个数
inuserregion :array[0..1024] of word; //接收数据缓冲区数
VoltageValue:array[0..100] of Single; //将AD转换为电压值
VoltageVal:single;
para:PCI8696_PARA_AD;
retsizewords:integer;
chStrValue:Array[0..50] of char;
i:integer;

begin
deviceid:=0;
hdevice:=pci8696_createdevice(deviceid); //创建设备
para.FirstChannel :=1;
para.LastChannel :=1;
para.Frequency :=1000; //1000采集频率
para.ADMode := PCI8696_ADMODE_SEQUENCE; //连续采集
para.TriggerMode := PCI8696_TRIGMODE_SOFT ; //使用内部触发,
para.TriggerType := PCI8696_TRIGTYPE_EDGE; //边沿触发类型
para.TriggerDir :=PCI8696_TRIGDIR_POSITIVE; //正向触发
nchannelcount:=1; //通道数为1
para.ClockSource :=PCI8696_CLOCKSRC_IN; //内部时钟
para.GroundingMode := PCI8696_GNDMODE_SE; //模拟输入量接地方式单端
para.InputRange := PCI8696_INPUT_0_P5000mV; //模拟量使用输入范围0~5000mv
para.Gains :=PCI8696_GAINS_1MULT ; //1倍增益

breturnstatus:=pci8696_initdeviceproad(hdevice,@para);
if breturnstatus=false then
ShowMessage('设备初始化失败!');
readsizewords:=1000 ;
BRETURNSTATUS:=pci8696_startDevicePROAD(HDEVICE);
if breturnstatus=false then
showmessage('设备启动失败!');
form1.Chart1.Locked :=true;
while form1.CheckBox1.Checked do
begin
pci8696_readdeviceproad_npt(hdevice,@inuserregion,readsizewords,@retsizewords);
for i:=0 to retsizewords-1 do
begin
voltageval:=(5000.0/16384)*(inuserregion[i] XOR $2000 AND $3fff);
strvalue:=format('0.00',[voltageval]);

synchronize(giveseries);
end;
end;

form1.chart1.Locked :=false;
pci8696_stopdeviceproad(hdevice);
pci8696_ReleaseDeviceproad(hdevice);
pci8696_releasedevice(hdevice);
end;
JohnYale 2009-08-08
  • 打赏
  • 举报
回复
想象不出为什么会这样。来点代码吧

1,185

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧