【发布时间】:2014-11-19 16:49:50
【问题描述】:
我有一个本地 C++ DLL。 DLL 创建一个从外部设备重复读取数据的线程。如果数据读取速度不够快,设备可能会溢出。
“读取”循环如下所示:
while (true)
{
read_from_device();
buffer_data();
Sleep(5); //Allow data to accumulate
}
我还有一个使用上述 DLL 的 C# 应用程序。它调用 DLL 中的一个函数来启动“读取”线程,然后定期调用 DLL 中的另一个函数来检查是否已从外部设备读取所有数据。
应用程序和 DLL 在 Visual Studio(本例中为 2008)中的“调试”模式下构建。
如果我通过 Visual Studio 运行应用程序,一切都很好:从外部设备读取数据并且不会发生溢出。
当我“独立”运行同一个应用程序(通过直接运行 .exe)时,我遇到了溢出。
我认为唯一的区别是在第一个实例中,Visual Studio 调试器会自动附加到应用程序?请记住,我没有设置断点。
我的应用程序中一定存在时间问题,当调试器附加到它时,它以某种方式得到纠正?
我该如何调试这个问题?
通过 Visual Studio 运行应用程序与直接运行应用程序之间还有哪些区别?
编辑:
下面是更详细的代码:
int buffer[MAX_EVENTS*2];
int bufferIndex = 0;
int eventsReturned = 0;
BufferObject *pNewBuffer;
while (bPollData)
{
read_data(buffer[bufferIndex], &eventsReturned);
bufferIndex += eventsReturned;
if (bufferIndex >= MAX_EVENTS)
{
pNewBuffer = new BufferObject(buffer, bufferIndex);
myList.AddTail(pNewBuffer);
bufferIndex = 0;
}
Sleep(5);
}
...
...
class BufferObject {
int *buffer;
int bufferSize;
public:
BufferObject(int* source, int size)
{
buffer = new int[size];
bufferSize = size;
memcpy(buffer, source, size);
}
};
【问题讨论】:
-
通常和内存有关。无论如何,我们需要查看更多代码。
-
您是否正在使用优化编译您的 DLL?您是否尝试过移除睡眠,即使它在连接到 VS 时工作正常?
-
检查 Windows 日志中是否存在导致崩溃的错误
-
你为什么要睡在那里?当然,如果你想避免溢出,你应该尽可能快地阅读。顺便说一句,你最好让你的读取循环检查手动重置事件,这样你就可以在完成后干净地关闭你的线程......
-
@LenHolgate 睡眠是为了让数据积累。如果我过于频繁地从设备读取数据,则设备会将所有时间都花在服务请求上,而不是收集数据。该线程确实有更好的关闭方式,我只是没有包含它。
标签: c# c++ visual-studio