我有两个主题.一种是从串行端口收集数据并将其放入一个数组中,然后将其添加到并发队列中.另一个线程是采用这些数组并实时绘制数据.每秒大约有150个数据包,每个50字节.我遇到的问题是,当它运行时,它消耗大约10%的CPU.这是一个非常快速的核心I7 Haswell.如果我在消费线程中添加Thread.Sleep(1),则CPU利用率降至1%.问题是如果我把它放在Thread.Sleep(2)然后数据包不再同步.所以这不是一个解决方案,如果它在较慢的计算机上运行,它可能无法正常工作.
代码很简单.这是生产者线程:
static void FillQueue(byte[] buffer)
{
dataQueue.Enqueue(buffer);
}
Run Code Online (Sandbox Code Playgroud)
这是消费者线程:
while (continuePolling)
{
Thread.Sleep(1); //if removed, there is 10% CPU utilization. If higher then packet synchronization is lost.
if (dataQueue.TryDequeue(out result))
{
ProcessPacket(result);
}
}
Run Code Online (Sandbox Code Playgroud)
我发现这很难理解,因为ProcessPacket方法执行大约需要0.3毫秒,并且每秒调用大约10秒.
我现在尝试使用阻塞集合.这是制片人
BlockingCollection<byte[]> dataQueue = new BlockingCollection<byte[]>;
public static void addData(buffer)
{
dataQueue.add(buffer);
}
Run Code Online (Sandbox Code Playgroud)
这是消费者
while (dataQueue.TryTake(out result)
{
ProcessPacket(result);
}
Run Code Online (Sandbox Code Playgroud)
完全没有区别!它使用10%的CPU,如果我添加一个Thread.Sleep(1)是好的,但Thread.Sleep(2)和我丢失的数据包我得不到它.每个数据包中有50个字节.而已.它们的消耗速度和生产速度一样快.谢谢
我正在从USB设备收集数据,这些数据必须转到音频输出组件.目前,我没有足够快地提供数据以避免输出信号中的咔嗒声.所以每毫秒都很重要.
目前,我正在收集以65536字节的字节数组传送的数据.前两个字节表示小端格式的16位数据.这两个字节必须放在double数组的第一个元素中.后两个字节必须放在不同双数组的第一个元素中.然后对65536缓冲区中的所有字节重复此操作,以便最终得到2 double[]个大小为16384的数组.
我目前正在使用BitConverter.ToInt16,如代码所示.运行它需要大约0.3ms,但必须完成10次才能将数据包发送到音频输出.所以开销是3ms,这足以使一些数据包最终无法按时交付.
码
byte[] buffer = new byte[65536];
double[] bufferA = new double[16384];
double[] bufferB = new double[16384]
for(int i= 0; i < 65536; i +=4)
{
bufferA[i/4] = BitConverter.ToInt16(buffer, i);
bufferB[i/4] = BitConverter.ToInt16(buffer, i+2);
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能改善这个?是否可以使用不安全的代码复制值?我没有这方面的经验.谢谢
我正在把我的头发拉到这个上面。非常简单的windows窗体程序。我有一个富文本框,我想防止退格键在富文本框中执行任何操作。这是我的代码
private void richTextBox1_KeyPress(object sender, KeyPressEventArgs e)
{
if (e.KeyChar == (char)Keys.Back)
{
e.handled = true;
}
}
Run Code Online (Sandbox Code Playgroud)
如果我在 e.handled 处放置一个断点并输入一个退格,它确实会中断。然而,退格键仍然使它进入富文本框。所以我看到了使用 PreviewKeyDown 的例子,但是这些例子都没有!我试过
void richTextBox1.PreviewKeyDown(object sender, KeyPressEventArgs e)
{
e.Handled = true;
}
Run Code Online (Sandbox Code Playgroud)
但是 KeyPressEventArgs 无效!如果我使用 Forms 提供的 PreviewKeyDownEventArgs 并且没有 e.Handles 可用。那么如何做到这一点呢?
谢谢
我有两个数组。一个包含“真实”值,另一个包含“虚”值。这两个数组需要组合成一个复数数组。我尝试了以下方法:
Complex[] complexArray = new Complex[16384];
for (int i = 0; i <16384; i++)
(
complexArray[i].Real = realArray[i];
complexArray[i].Imaginary = imaginaryArray[i];
}
Run Code Online (Sandbox Code Playgroud)
它不起作用。它给出了错误:属性或索引器“System.Numerics.Complex.Real”不能被分配——它是只读的我知道复数是不可变的,但是如何创建这样一个数组?
更重要的是,一旦我有了这个数组,我就想移动其中的值。
c# ×4
.net ×1
bitconverter ×1
concurrency ×1
keypreview ×1
queue ×1
richtextbox ×1
winforms ×1