我正在使用ANSI C编写的自定义DLL创建一个数据发送器项目。我的目标是发送数据块,每个数据必须在OnDataSendingDone
回调中通过内部发送后确认。
问题是我不知道如何将该回调挂钩到一个事件,所以我可以在每个SendByte
之后等待它。也许事件不是一个好主意。
我的问题是:如何在OnDataSendingDone
之后等待SendByte
回调?
请给我一些线索。以下是代码段:
class LibWrapper
{
[DllImport(dllPath, CallingConvention = CallingConvention.Cdecl, EntryPoint = "SetCallback")]
public static extern bool SetCallback(byte functype, Delegate func);
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void CallbackDelegate(UInt32 handle);
private static CallbackDelegate OnDataSendingDone;
public void OnDataSendingDoneCallback(CallbackDelegate callback)
{
OnDataSendingDone_ft = new CallbackDelegate2(callback);
SetCallback(FT_DATASENDINGDONE, OnDataSendingDone_ft);
}
}
class Transmitter
{
LibWrapper lib = new LibWrapper();
byte[] data = new byte[10];
public void OnDataSendingDone(UInt32 handle)
{
return;
}
lib.OnDataSendingDoneCallback(OnDataSendingDone);
public void TransmitData()
{
// here: sequential data transmission
foreach (byte b in data)
{
lib.SendByte(b);
// here: wait for OnDataSendingDone
}
}
}
答案 0 :(得分:0)
如果我理解正确,你可以这样做:
class Transmitter
{
LibWrapper lib = new LibWrapper();
private AutoResetEvent evt = new AutoResetEvent(false);
byte[] data;
public void OnDataSendingDone(UInt32 handle)
{
evt.Set();
}
public void TransmitData()
{
// here: sequential data transmission
foreach (byte b in data)
{
lib.SendByte(b);
if (!evt.WaitOne(15000)) // or whatever timeout makes sense
throw new Exception("timed out");
}
}
}