0

我正在使用用 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
        }
    }
}
4

1 回答 1

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");
        }
    }
}
于 2013-10-11T00:19:06.457 回答