MSCOMM控件和线程问题

upsonn 2007-05-10 01:44:28
一个基于对话框的串口通信程序,使用MSCOMM控件。
在主对话框类里定义:CMScomm m_com;
使用向导添加处理函数:OnCommMscomm();

我现在的问题是:
正常情况:如果在主线程中打开、设置串口,则OnCommMscomm()能够响应串口数据。
异常情况:如果我在一个新起的子线程中打开、设置串口,如果线程没有结束,则OnCommMscomm()能够响应串口数据。如果此子线程结束,则OnCommMscomm()不响应串口数据。

如果调用m_com.GetPortOpen()查看串口状态,却又是打开的!
m_com作为主对话框类成员,对该类来说应该是共享的,即使是在新启动的线程中打开,应该对整个类有效。只要我没在线程中关闭串口,即使线程结束,在该类的其它成员眼中,串口应该是处在打开并有效地状态吧?

不解,是否是对线程理解有误?望各位见解一下,谢谢
...全文
391 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
HELLO_CSDN 2011-04-28
  • 打赏
  • 举报
回复
我也在这纠结呢 到底串口控件支不支持多线程啊……
qq361301276 2011-04-08
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jmshl 的回复:]
MSCOMM控件不支持多线程
[/Quote]

何解?
galactic 2009-03-10
  • 打赏
  • 举报
回复
还有一个问题 我在一个线程中用MSComm控件来发送数据 为什么一运行到comm发数据的时候 程序就崩溃呢?测试了一下 不只是用output的时候 而是一调用MSComm控件 程序就崩溃 这是为什么呢?
upsonn 2007-05-10
  • 打赏
  • 举报
回复
思考了一下,简而言之:我要在新创建的线程中操作和使用mscomm控件,而在主程序中读取mscomm控件从串口中出来的数据。
upsonn 2007-05-10
  • 打赏
  • 举报
回复
另一问:MSCOMM控件的响应函数只能在主线程中吗?因为要同时支持8路的串口通信和串口数据(高速)处理,如果8路都在主线程中处理,估计运行起来,程序就处在“僵死”状态,UI不响应用户了!
upsonn 2007-05-10
  • 打赏
  • 举报
回复
首先,一个MSCOMM控件只能对应一个串口。但不知楼上两位“MSCOMM控件不支持多线程”怎么来理解合适?——子线程中操作的串口,对主线程来说是无效的?但我在子线程给串口写信息是正常的,只要我子线程不结束,主线程能够正常响应串口过来的信息,这作何解?
setsailgo 2007-05-10
  • 打赏
  • 举报
回复
MSCOMM控件不支持多线程
upsonn 2007-05-10
  • 打赏
  • 举报
回复
这样打开串口,则串口响应正常:
void CGpsTestWizardDlg::OnButtonRun()
{
// TODO: Add your control notification handler code here
if(m_com.GetPortOpen())
m_com.SetPortOpen(FALSE);

m_com.SetCommPort(iPort);
if(!m_com.GetPortOpen())
m_com.SetPortOpen(TRUE);
else
AfxMessageBox("Can not open serial port");

m_com.SetSettings(szComSetting);
m_com.SetRThreshold(1);
m_com.SetInputMode(1);
m_com.SetInputLen(0);
m_com.GetInput();
return;
}


如果这样,在一个子线程中打开串口,则:如果子线程不结束,则串口响应正常。如果子线程结束,则串口无响应,但用m_com.GetPortOpen()查询却显示串口是打开的:
void CGpsTestWizardDlg::OnButtonRun()
{
// TODO: Add your control notification handler code here
::AfxBeginThread(ThreadGpsTest,(LPVOID)this);
return;
}

UINT ThreadGpsTest(LPVOID pParam)
{
CGpsTestWizardDlg * pApp = (CGpsTestWizardDlg *)pParam;

if(pApp->m_com.GetPortOpen())
pApp->m_com.SetPortOpen(FALSE);

pApp->m_com.SetCommPort(iPort);
if(!pApp->m_com.GetPortOpen())
pApp->m_com.SetPortOpen(TRUE);
else
AfxMessageBox("Can not open serial port");

pApp->m_com.SetSettings(szComSetting);
pApp->m_com.SetRThreshold(1);
pApp->m_com.SetInputMode(1);
pApp->m_com.SetInputLen(0);
pApp->m_com.GetInput();

return 1;

}
Jarrylogin 2007-05-10
  • 打赏
  • 举报
回复
CSerialPort类网上下载
Jarrylogin 2007-05-10
  • 打赏
  • 举报
回复
MSCOMM控件不能和线程同时使用,使用CSerialPort类

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧