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;
}
}
...