有一个外部库,其函数返回一个具有一定延迟的值(休眠200-1000ms),C ++代码:
__declspec( dllexport )
char ReadNextChar()
{
char OneChar[2];
while (Receive((char*)&OneChar)==-1) {Sleep(200);}
return OneChar[0];
}
在主程序运行线程中, C#代码:
public void Start()
{
thread = new Thread(ReadChar);
thread.IsBackground = true;
thread.Priority = ThreadPriority.BelowNormal;
thread.Start()
}
char currentChar;
[DllImport("reader.dll")]
public extern char ReadNextChar();
private void ReadChar()
{
while(true) {
currentChar=ReadNextChar();
}
}
在我看来,这可以得到认真优化。执行此任务的最佳方法是什么? (外部函数睡眠时它是如何工作的?)。感谢。
答案 0 :(得分:1)
在win32上执行此操作的典型方法是使用事件并从ReadNextChar函数发出此事件的信号。 这是使用重叠模式(http://msdn.microsoft.com/en-us/library/aa365467(v=vs.85).aspx)
时Win32 ReadFile函数的工作方式然后,您可以使用WaitForSingleObject将线程置于休眠状态。当事件发出信号时,它将再次运行。
这会使您的实现更复杂,并且还需要修改dll。现在,如果您正在进行的读取实际上可以等待,那么真的值得这样做 - 否则您将最终必须在您的dll中添加另一个线程来轮询和设置事件(如果您是这样做是为了优化目的,因为这将是一个悲观的优化,至少可以说。
老实说,由于您可能至少睡了200毫秒,因此轮询读取功能不太可能导致任何重大性能问题 - 请不要为此进行优化。
显然,你的代码没有做的事情就是让线程退出而不终止()。我个人会把睡眠放在c#代码中,并从ReadNextChar函数返回一个读取成功代码,而不会在循环中旋转或在那里有任何睡眠。我希望你的代码只是一个例子..
答案 1 :(得分:0)
您的外部函数在同一个线程上执行,因此在等待时无法“停止”。
你已经在一个帖子中运行ReadChar
,这就是在外部代码中调用sleep时睡眠的确切步骤。
答案 2 :(得分:0)
假设您的意思是“如果在非托管睡眠方法中,如何阻止线程运行?”那么答案就是你不能 - 至少没有调用你真正不应该做的TerminateThread
但是,您可以在代码返回托管代码时通过检查while中的标志而不是使用while(true)来结束
或者当你的进程以后台线程结束时线程将结束