2010-08-13 110 views
0

我有一個函數,singleFrameEventHandler,我希望當一個特定的事件,OnNewFrame,發生被調用。之後做一些研究,但在我看來,它處理事件的函數void返回類型,並採取包含事件類型的參數。從我能在網上找到的,就是這樣完成的:事件處理在C++/CLI

函數聲明:

void singleFrameEventHandler(IAFrame^frame); 

當該功能被分配到處理該事件:當我試圖編譯

iaframe->OnNewFrame += &singleFrameEventHandler; 

代碼包含上述段,我得到以下錯誤:

error C2664: 'Spiricon::BeamGage::Automation::Interfaces::IAFrame::OnNewFrame::add' : cannot convert parameter 1 from 'void (__clrcall *)(Spiricon::BeamGage::Automation::Interfaces::IAFrame ^)' to 'Spiricon::BeamGage::Automation::Interfaces::newFrame ^' 
No user-defined-conversion operator available, or 
There is no context in which this conversion is possible 

OnNewF RAME的類型是Spiricon的:: BeamGage ::自動化::接口:: newFrame的,不幸的是已經超越被描述爲沒有文件「當一個新的幀可用時調用的事件。」

在對象瀏覽器,我可以找到一些關於它的信息:(?)

public delegate newFrame: 
    public System.IAsyncResult BeginInvoke(System.AsyncCallback callback, System.Object object) 
    public System.Void EndInvoke(System.IAsyncResult result) 
    public System.Void Invoke() 
    public newFrame(System.Object object, System.IntPtr method) 

的newFrame的構造似乎是最好的選擇,因爲它似乎採取的方法指針,但是當我嘗試使用這樣的:

iaframe->OnNewFrame += gcnew newFrame(iaframe, &singleFrameEventHandler); 

我得到以下錯誤:

error C3352: 'singleFrameEventHandler' : the specified function does not match the delegate type 'void (void)' 

這是否由t我的函數必須不帶參數?如果是這樣,我將如何獲得有關該事件的信息?

回答

2

第一語法不能工作,這是C#語法糖是C++/CLI沒有。

與第2段的問題是,委託類型不匹配的事件處理程序的簽名。該委託被宣佈是這樣的:

delegate void newFrame(); 

你有你的方法簽名更改爲:

void singleFrameEventHandler() 
{ 
    // etc.. 
} 

你應該如何去框架的引用是不是從你的片段清晰。我猜猜這個班上的一個房產。在.NET

+0

好的,謝謝。我還發現,當我從工廠獲得IAFrame(其中還包括除事件以外的單個框架的數據)時,我得到最新的框架,因此我不需要事件處理程序來處理IAFrame對象傳遞給它。 – 2010-08-13 15:17:54

6

事件處理程序通常用兩個參數(見MSDN)定義

delegate void EventHandler(object sender, EventArgs e) 

但是,你已經張貼的強烈暗示OnNewFrame不遵循此模式的錯誤消息和singleFrameEventHandler應該採取沒有參數。

我的猜測是,這個API的開發者認爲,事件本身是足夠的信息,而該事件處理程序將存儲到IAFrame引用引發事件,如果需要查詢。類似於以下代碼應該工作(請注意,創建事件處理程序委託時,您需要引用擁有事件處理程序方法的類,而不是源對象):

class FrameEventHandlers 
{ 
public: 
    FrameEventHandlers(IAFrame^frame) 
     : m_frame(frame) 
    { 
     m_frame->OnNewFrame += gcnew newFrame(this, &FrameEventHandlers::singleFrameEventHandler); 
    } 

private: 
    void singleFrameEventHandler() 
    { 
     // query m_frame for new data 
    } 
};