不是很明白..唉...比如:串行口..缓冲区内现有1000个字节内容.......
怎么样设计这个多线程来快速读取这1000个字节..线程数在2个以上(注明:串行缓冲区在读取一个数后.缓冲内字节就少去一下....属于..队列方式的..)
请高手帮帮忙....小弟用于实时数据采集.
下位机以37KHZ频率采集...时间间隔为:27us 但是PC端的串口读读取速度不行...达不到实时... 怎么才可以达到高速读取呢...唉..说实话.37KHZ并不是什么高速了.
怎么样设计这个多线程来快速读取这1000个字节..线程数在2个以上(注明:串行缓冲区在读取一个数后.缓冲内字节就少去一下....属于..队列方式的..)
请高手帮帮忙....小弟用于实时数据采集.
下位机以37KHZ频率采集...时间间隔为:27us 但是PC端的串口读读取速度不行...达不到实时... 怎么才可以达到高速读取呢...唉..说实话.37KHZ并不是什么高速了.
解决方案 »
- 有关Delphi皮肤控件使用的问题
- 动态TreeView为什么每次打开都把全部节点展开了?
- 如何发布第三方控件?希望多指点!
- 那里有真正的SQL 2000简体中文个人版下??
- 求使用odac调用oracle存储过程的方法和实例
- ▲◎如何解决从窗体关闭到程序停止,程序运行时间长的问题
- 列求和
- BCB6的sp3出来了,delphi6 的呢?
- 为什么Table1.RecNo 和Query1.RecNo 总是为-1?
- 向各位请教:华硕P2-b最高支持什么CPU?
- 一个数据关联的问题!(急!)
- 帮个忙, 我没有DELPHI的光盘, 如何安装BDE? 我现在一个光WIN98, 数据库在服务器上, 没有BDE不可以访问!
用spcomm控件,spcomm本身就是多线程的,加大spcomm缓冲(默认是4K)。
115200要比19200的速度快的多的多。首先要确定每秒发送到PC串口的数据量有多大,然后确定一个合适波特率。
//////////////部分变量的申明.
var
PulckPulseThread:array[1..2] of TPulckPulseThread;
ReadIndex:integer;//读取指针
PulckPulse_RBuf: byte;//保存读取记录
CBuf:array[1..2000] of byte;//保存读取转换后的数值
ReadArray:array of byte;
len,i:integer;
.........
{ TPulckPulseThread }
//==============================================================================
// 线程处理部分.
//==============================================================================
procedure TPulckPulseThread.Execute;
begin
FreeOnTerminate:=true;
while (not Terminated) do
begin
EnterCriticalSection(CS);
setLength(readarray,5000);
McuComm.ReadComm_MaxSize(ComNo,ReadArray,len);
if len>0 then
begin
setLength(readarray,len);
for i:=low(readarray) to high(readarray) do
begin
postMessage(pluckForm.Handle,WM_MCU_IrDA,readarray[i],0);
end;
end;
// application.ProcessMessages;
LeaveCriticalSection(CS);
end;
end;======================暂停线程处理========================================
procedure TMCUCtr.PluckPulseStop;
begin
MCUCMD[1]:=$0C;
MCUCMD[2]:=$00;
MCUCMD[3]:=$00;//TH0
MCUCMD[4]:=$ff;//TL0
mcucomm.SendArrayByte(MCUCMD);
mcucomm.ClearComBuf(comNO);//清空缓冲区
for mod_i:=low(PulckPulseThread) to high(PulckPulseThread) do
begin
if PulckPulseThread[i].Suspended=false then
PulckPulseThread[i].Suspend;
end;
end;
=========================================================================
=========================================================================
其它代码就略过去了....这里启动一切正常....下位机以40KHZ采集率频......并以19200bpf速率上传..... 当我暂停这几个线程时...就出现错误了: (错误指下面)
for mod_i:=low(PulckPulseThread) to high(PulckPulseThread) do
begin
if PulckPulseThread[i].Suspended=false then
PulckPulseThread[i].Suspend;
end;=========
我把:下面这2个变量...放在procedure TPulckPulseThread.Execute; 里..则可以正常轻描暂停该线程....
ReadArray:array of byte;
len,i:integer;
==================我不知道为什么...想不通..
我的理解,用多线程反而慢
我把:下面这2个变量...放在procedure TPulckPulseThread.Execute; 里..则可以正常轻描暂停该线程....
ReadArray:array of byte;
len,i:integer;
==================怎么可能?
全局变量与局部变量会导致出错? 会不会是你终止线程时没有释放导致的?
PulckPulseThread[i].Suspend;
我只是去暂停这几个线程........并没有去终止他..
Process stopped use Step or Run to continue.
begin
if PulckPulseThread[i].Suspended=false then
PulckPulseThread[i].Suspend;
end;这里的i应该是mod_i吧?
TPulckPulseThread=class(TThread)
private
// procedure PluckThread;
ReadArray:array of byte;
len:integer;
protected
procedure Execute;override;
end;
这样在关闭后..就没有出错了.
单线程的话...其最大循环花去多少时间呢?