C++ cli C++/接收的CLI串行COM数据作为触发器开关处理时出错

C++ cli C++/接收的CLI串行COM数据作为触发器开关处理时出错,c++-cli,C++ Cli,可能重复: fmain.h代码(部分) #定义左37 #定义最多38个 #定义权利39 #下定义40 ... // //tabControl1 // 此->选项卡控件1->控件->添加(此->选项卡页面1); 此->选项卡控件1->控件->添加(此->选项卡页面2); 此->选项卡控件1->控件->添加(此->选项卡页面3); 此->选项卡控制1->位置=系统::绘图::点(2,-1); 此->tabControl1->Name=L“tabControl1”; 此->选项卡控件1->选择

可能重复:

fmain.h代码(部分)

#定义左37
#定义最多38个
#定义权利39
#下定义40
...
// 
//tabControl1
// 
此->选项卡控件1->控件->添加(此->选项卡页面1);
此->选项卡控件1->控件->添加(此->选项卡页面2);
此->选项卡控件1->控件->添加(此->选项卡页面3);
此->选项卡控制1->位置=系统::绘图::点(2,-1);
此->tabControl1->Name=L“tabControl1”;
此->选项卡控件1->选择的索引=0;
此->选项卡控制1->大小=系统::绘图::大小(298255);
这->tabControl1->SizeMode=System::Windows::Forms::TabSizeMode::Fixed;
此->tabControl1->TabIndex=2;
this->tabControl1->KeyDown+=gcnewsystem::Windows::Forms::KeyEventHandler(this,&fMain::tabControl1\u KeyDown);
...
//TabControl中的键盘手柄(未在窗体中使用)
private:System::Void tabControl1\u KeyDown(System::Object^sender,System::Windows::Forms::KeyEventArgs^e){
如果((btnShuffle->Enabled)|(PictureLoaded==false))
返回;
开关(e->KeyCode)
{
案例左:
如果(blankTile.Col>0)
MoveTile(blankTile.Col-1,blankTile.Row);
打破
个案:
如果(blankTile.Row>0)
MoveTile(blankTile.Col,blankTile.Row-1);
打破
案例权利:
如果(blankTile.ColHandled=true;
CheckFinish();
}
...
//接收到串行通信数据
private:System::Void serialPort1_DataReceived(系统::对象^sender,系统::IO::端口::SerialDataReceivedEventArgs ^e){
RxData=serialPort1->ReadExisting();
交换机(System::Convert::ToInt32(RxData))
{
案例左:
如果(blankTile.Col>0)
MoveTile(blankTile.Col-1,blankTile.Row);
打破
个案:
如果(blankTile.Row>0)
MoveTile(blankTile.Col,blankTile.Row-1);
打破
案例权利:
如果(blankTile.Col
给我一个错误: 跨线程操作无效:从创建控件“fTile”的线程以外的线程访问控件“fTile”

我希望有人能帮助我。。
ps:im仍然是c++/cli编程的新手

您不能触摸DataReceived事件处理程序中的任何UI控件,它在工作线程上运行。需要使用Control::BeginInvoke()。关于它已经有数百个问题,请在右上角的搜索框中输入“Cross thread operation not valid”。在你提问之前,请使用搜索功能或谷歌。我还是新手,正在学习很多东西。。我已经搜索过了,很多都是C语言的,我仍然不知道如何使用Invoke。在何处放置控件::BeginInvoke()?
    #define LEFT 37
    #define UP 38
    #define RIGHT 39
    #define DOWN 40
     ...
            // 
            // tabControl1
            // 
            this->tabControl1->Controls->Add(this->tabPage1);
            this->tabControl1->Controls->Add(this->tabPage2);
            this->tabControl1->Controls->Add(this->tabPage3);
            this->tabControl1->Location = System::Drawing::Point(2, -1);
            this->tabControl1->Name = L"tabControl1";
            this->tabControl1->SelectedIndex = 0;
            this->tabControl1->Size = System::Drawing::Size(298, 255);
            this->tabControl1->SizeMode = System::Windows::Forms::TabSizeMode::Fixed;
            this->tabControl1->TabIndex = 2;
            this->tabControl1->KeyDown += gcnew System::Windows::Forms::KeyEventHandler(this, &fMain::tabControl1_KeyDown);

        ...
    //keyboard handle in TabControl (not worked in Form)
    private: System::Void tabControl1_KeyDown(System::Object^  sender, System::Windows::Forms::KeyEventArgs^  e) {
                    if ((btnShuffle->Enabled) | (PictureLoaded == false))
                        return;

                    switch(e->KeyCode)
                    {
                    case LEFT:
                        if (blankTile.Col > 0)
                            MoveTile(blankTile.Col - 1, blankTile.Row);
                        break;
                    case UP:
                        if (blankTile.Row > 0)
                            MoveTile(blankTile.Col, blankTile.Row - 1);
                        break;
                    case RIGHT:
                        if (blankTile.Col < nCols - 1)
                            MoveTile(blankTile.Col + 1, blankTile.Row);
                        break;
                    case DOWN:
                        if (blankTile.Row < nRows - 1)
                            MoveTile(blankTile.Col, blankTile.Row + 1);
                        break;
                    }

                    e->Handled = true;

                    CheckFinish();
                 }

        ...

    //Serial communication data received
    private: System::Void serialPort1_DataReceived(System::Object^  sender, System::IO::Ports::SerialDataReceivedEventArgs^  e) {
                     RxData = serialPort1->ReadExisting();

                     switch(System::Convert::ToInt32(RxData))
                     {
                     case LEFT:
                         if (blankTile.Col > 0)
                             MoveTile(blankTile.Col - 1, blankTile.Row);
                         break;
                     case UP:
                         if (blankTile.Row > 0)
                             MoveTile(blankTile.Col, blankTile.Row - 1);
                         break;
                     case RIGHT:
                         if (blankTile.Col < nCols - 1)
                             MoveTile(blankTile.Col + 1, blankTile.Row);
                         break;
                     case DOWN:
                         if (blankTile.Row < nRows - 1)
                             MoveTile(blankTile.Col, blankTile.Row + 1);
                         break;
                     }
                 }

    ...