2013-10-10 85 views
0

我使用用ANSI C編寫的自定義DLL創建數據發送器的項目。我的目標是發送大量的數據,每個數據必須通過構建OnDataSendingDone回調後發送確認。來自外部回調的事件

問題是我不知道如何將該回調掛接到事件,所以我可以在每個SendByte之後等待它。也許事件不是一個好主意。

我的問題是:如何在SendByte之後等待OnDataSendingDone回調?

請給我一些線索。以下是代碼片段:

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

如果我理解正確的話,你可以做這樣的事情:

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"); 
     } 
    } 
}