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 に答える