簡體   English   中英

無法找出錯誤原因從C ++回調到C#的跨線程操作無效

[英]Unable to find out reason of error Cross-thread operation not valid from C++ callback to C#

我將像在Objective-C中一樣實現委托的MVC結構。 基本上,我的功能就像藍牙設備向我發出信號,我在C ++回調中將其抓住,然后將該信號消息轉發給C#lambda函數的回調。 我出現以下錯誤,

跨線程操作無效:從創建該線程的線程以外的線程訪問控件“ label1”。

我的C#代碼Form1.cs,

[UnmanagedFunctionPointer(CallingConvention.StdCall)]
    delegate void ProgressCallback(char theValue);

private void button1_Click(object sender, EventArgs e)
        {
             if (NclWrapper.isNclInitialized())
                {
                    NclWrapper.callNclDiscovery();
                    label1.Text = NclWrapper.getLedPattern();

                    ProgressCallback callback = (theValue) =>
                    {
                      //Crash is here when i going to assign value to lable.
                        this.label1.Text = theValue.ToString();
                        Console.WriteLine("Progress = {0}", theValue);
                    };
                    NclWrapper.DoWork(callback);
                 }
            }
        }

我在C#中的C ++ DLL包裝器

[DllImport("My.dll", CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Auto)]
    public static extern void DoWork([MarshalAs(UnmanagedType.FunctionPtr)] ProgressCallback callbackPointer);

我的C ++ .cpp類委托分配,

 ProgressCallback myDelegateObject;
    __declspec(dllexport) void DoWork(ProgressCallback progressCallback)
    {
            if (progressCallback)
            {
              myDelegateObject = progressCallback;
            }
    }

我的C ++發送回調消息

void callback(MyEvent event, void* userData){

    wchar_t  ch[6];
    ULONG  ulSize;
    switch(event.type){
/// [callbackInit]
    case MY_EVENT_INIT:
            if(event.init.success) gMyInitialized=true;
            else exit(-1);
            prevEvent = event.type; 
            break;
/// [callbackAgreement]
        case My_EVENT_AGREEMENT:
            gHandle=event.agreement.myHandle;
            for(unsigned i=0; i<My_AGREEMENT_PATTERNS; ++i){
                for(unsigned j=0; j<My_LEDS; ++j){
                    if(event.agreement.leds[i][j]){
                        ch[j]='1';
                    }else{
                        ch[j]='0';
                    }
                }
                std::cout<<"\n";
            }
            ch[5]='\0';
            ulSize = (wcslen(ch) * sizeof(wchar_t)) + sizeof(wchar_t);
            ledPattern = NULL;
            ledPattern = (wchar_t*)::CoTaskMemAlloc(ulSize);
            wcscpy(ledPattern, ch);
            prevEvent = event.type;

            //My delegate callback is here
            myDelegateObject('D');
            break;

        default: break;
    }

}

我哪里錯了?

 ProgressCallback callback = (theValue) =>
                    {
                        label1.Invoke((MethodInvoker)delegate {
                             label1.Text = theValue.ToString();
                        });
                    };

這段代碼會更新我的標簽文本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM