![](/img/trans.png)
[英]Thread exception error in C# :Cross-thread operation not valid: Control 'lblp4' accessed from a Cross-thread operation not valid
[英]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.