请教c#多线程 *** 作更新控件的简便方法

请教c#多线程 *** 作更新控件的简便方法,第1张

char*c[]={"ENTER","NEW","POIT","源腊FIRST"}//指针数组,数组的每个元素是指戚裂高针,这里存常量字符串的首地址。char**cp[]={c+3,c+2,c+1,c}//二级指针数组,数组每个元素是二级指针,这里存了c[3].c[2],c[1],c[0]的地址,也就是上面字符串顺序逆序char***cpp=cp三级指针指向cp数组首地址。ps,一般三级指针在正常的高尺程序里不会出现,容易形成非常混乱的局面。printf("%s\n",**++cpp)POIT//优先级相同,临近原则++cpp--->c+2的地址,两次间址是POITprintf("%s\n,",*--*++cpp)ENTER//++cpp--->cp+1(上面自增过了),间址一次变成cp[1],--c+1再间地址,就是c第一个元素。ENTER。printf("%s\n",*cpp[-2]+3)ST//cpp指向c+1的位置。cpp[-2]就是*(cpp-2)指向cp+0,就是c+3*(c+3)+3不就是FIRST数第四个字母么,后面输出ST。printf("%s\n",cpp[-1][-1]+1)上面cpp还是指向在c+1,*(cpp-1)是c+2,*(*c+2-1)--->c+1,NEW这个单词地址,*((*(c+1))+1)数到E往后输出}

1:添加MSComm控件2:为对话框添加MSComm控件成员变量右击MSComm控件,然后选择Add Variable...3:为对话框添加OnComm事件右击MSComm控件,然后选择Add Event Handle..4:打开/关闭串口.

void Ctbox_debug_viewDlg::OnBnClickedBtOpen()

{

// TODO: Add your control notification handler code here

if(m_mscomm.get_PortOpen())

{

m_mscomm.put_PortOpen(FALSE)

GetDlgItem(IDC_BT_OPEN)->SetWindowText(_T("打开"))

ShowInfo(_T("关闭串口成功!"))

m_OpenStatus =false

return

}

UpdateData(TRUE)

m_OpenStatus =true

//当前端口号

m_mscomm.put_CommPort(m_Port+1)//端口号

m_mscomm.put_InBufferSize(1024)//接收缓冲区

m_mscomm.put_OutBufferSize(1024)//发送缓冲区

m_mscomm.put_InputLen(0)//设置当前接收区数据长度为0,表示全部读取

m_mscomm.put_InputMode(1)//以二进制方式读写数据

m_mscomm.put_RThreshold(1)//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm事件

//波特率

DWORD baudrate

switch(m_CombolBaudrate.GetCurSel())

{

case 0:

baudrate =115200

break

case 1:

baudrate =9600

break

default:

ASSERT(FALSE)

break

}

CString setting

setting.Format(_T("%d,n,8,1"),baudrate)

m_mscomm.put_Settings(setting/*_T("115200,n,8,1")*/)//波特率,无校验,8个数据位,1个停止1位

m_mscomm.put_PortOpen(TRUE)//打开串口

GetDlgItem(IDC_BT_OPEN)->SetWindowText(_T("关闭"))

ShowInfo(_T("打开串口成功!"))

}

5:接收串口数据宴野

void Ctbox_debug_viewDlg::OnCommMscomm1()

{

// TODO: Add your message handler code here

short curEvent =m_mscomm.get_CommEvent()

switch(curEvent)

{

case CMscomm1::comEvReceive:

EvReceiveHandle()

break

}

}

void Ctbox_debug_viewDlg::EvReceiveHandle(void)

{

static unsigned int cnt=0

VARIANT variant_inp

COleSafeArray safearray_inp

long len,k

/*unsigned intdata[1024]={0}*/

BYTE rxdata[1024]//设置BYTE数组

CString strtemp

cnt++

variant_inp= m_mscomm.get_Input()//读取缓冲区

safearray_inp= variant_inp//变量转换

len= safearray_inp.GetOneDimSize()//得到有山祥冲效的数据长度

for (k=0k<lenk++)

{

safearray_inp.GetElement(&k,rxdata+k)

}

/*char c_char*/

for (k=0k<lenk++)

{

strtemp.Format(_T("%c"),*(rxdata+k))

m_RecveString +=strtemp

if(*(rxdata+k) =='\n')

{

ShowInfoByFilter(m_RecveString)

m_RecveString =""逗歼

}

}

}

6:发送串口数据

void Ctbox_debug_viewDlg::OnBnClickedBtSend()

{

// TODO: Add your control notification handler code here

if(m_OpenStatus ==false)

{

AfxMessageBox(_T("请先打开串口"))

return

}

UpdateData(TRUE)

if(m_SendString.IsEmpty())

return

if(m_AutoAddLF)

{

m_SendString +="\r\n"

}

m_mscomm.put_Output(COleVariant(m_SendString))

ShowInfo(m_SendString)

}

在辅助线程调用下面的方法InvokeControl()//(在创建辅助线程时可将此方法通过delegate传到辅助线程中)

//写在主线程中(windows控件)

private void InvokeControl()

{

if (this.InvokeRequired)

this.Invoke(new DelegateChangeText(ChangeText))

else

this.ChangeText()

}

private void ChangeText()

{

this.TextBox.Text = "sd"

}

public delegate void DelegateChangeText()

我在窗体内 创建了线程A用于监逗简听连接 怠粻氏指神壁饺撰祭辩熄菠陇 然后在接歼亏受到连接后 由线程A创建了线程B来处理连接 在线程B内 我要改写窗体上控件的属性 请问怎么弄?


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/yw/12541843.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-26
下一篇 2023-05-26

发表评论

登录后才能评论

评论列表(0条)

保存