无法找出错误原因 跨线程操作从回调到 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 函数的回调。我得到以下错误,
跨线程操作无效:从 创建它的线程以外的线程。
我的 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]=' ';
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();
});
};
此代码内容更新我的标签文本。
相关文章:
- 架构决策:返回std::future还是提供回调
- 正在为Xtensa simcall函数编写回调函数
- 如何在C++中使用非静态成员函数作为回调函数
- FLTK:按下哪个按钮 - 将数字传递给按钮的回调 (lambda)
- 在简单示例中,Python3 + ctypes 回调会导致内存泄漏
- 用于在回调中调用解析器的设计模式
- 如何使用C++对象的成员函数作为 C 样式回调?
- Java从C++回调到C++回调
- 如何将成员函数作为回调参数传递给需要"typedef-ed"自由函数指针的函数?
- 从不同的 cpp 调用回调函数会导致bad_function_call
- pcap_handler回调仅在使用 NPCAP v0.9991 时包含空数据包
- 不带轮询的 SDL2 事件回调
- C++存储带有可变参数的回调
- 如何使用 Node-addon-API 实现 node-nan 回调
- 如何使用软化工具包从 OPC UA 服务器异步读取操作回调中的数据值响应中获取 NodeId 详细信息
- ASIO IO完成回调订单与实际IO操作的顺序
- 如何使用GLUT的回调操作数据
- C# C++互操作回调
- 无法找出错误原因 跨线程操作从回调到 C# C++无效
- c++与c#的互操作,传递回调给c++函数