多线程采集数据如何能更快点!! (200分)

  • 主题发起人 主题发起人 wzpok
  • 开始时间 开始时间
W

wzpok

Unregistered / Unconfirmed
GUEST, unregistred user!
我采用研华的PCI1751中的计数器来采集数据。
我用一个线程中的死循环来检查采集卡每隔1ms产生的一个中断。 如果有中断就读取计数器中的计数。但是我现在总是丢数或计数不准。我想知道首先delphi中多线程中分给线程的
时间片能够完成一毫秒内判断中断是否产生并且读数。是不是我还没有读完,时间片已经分给其它线程啦。第二如果能如何效率更高一点,如何测试我线程中执行一次循环需要花费的时间!!
 
这个问题有意思,把线程的优先权设置高一些试试。
 
死循环 系统会吃不消的吧?
 
分配算法
 
提高采集线程的优先级,采集线程只负责读卡上的计数。
数据处理、存贮等用其它线程进行;负责处理数据的线程优先级应比采集线程低。
由采集线程采集的数据只需要加到一个列表中。
处理线程每次进行处理时,每次进行处理时,要处理完队列中的数据。
对采集线程中的计时要进行补偿。
如:
type
TGatherThread = class(Thread)
private
procedure Execute;
end;

procedure TGatherThread.Execute;
var
Freq, Time1, Time2: int64;
begin
QueryPerformanceFrequency(TLargeInteger((@Freq)^));
QueryPerformanceCounter(TLargeInteger((@Time1)^));
While Terminated = falsedo
begin
QueryPerformanceCounter(TLargeInteger((@Time2)^));
if (Time2 - Time1) / Freq * 1000 > 1 then
begin
QueryPerformanceCounter(TLargeInteger((@Time1)^));
// 放在前面,以补偿取数据过程中的时间消耗
// 取读据
...
end;
end;
end;
 
如何精确计时?在ontime加入下面的代码:
TotalTime :=(GetTickCount -begin
_Time ) div 1000 +1;
 
GetTickCount
The GetTickCount function retrieves the number of [red]milliseconds[/red] that have elapsed since the system was started. It is limited to the resolution of the system timer. To obtain the system timer resolution, use the GetSystemTimeAdjustment function.
 
后退
顶部