VC++ MSComm以及多线程问题

galactic 2009-02-26 03:50:17
我现在有一个用MSComm控件的程序,现在想实现这样一个功能:

程序中有一个比较大的循环【for(;;)】,一旦MSComm口接收到数据,则这个循环挂起(暂停),程序转而执行MSComm口接收并处理数据的操作(在Comm口的OnComm事件中进行),当这个执行完成以后(一直到接收到下一组数据之前),重新进行外部循环的操作(不是继续循环,是重新进行循环),然后如果MSComm口又接收到数据,则这个循环又挂起……………………

*****发送端每隔3秒向MSComm口发送一次数据*****

我现在想问一下,如果想实现我上面说的这样一个功能,是不是要用到多线程的技术,最好能指点一下具体实现的办法,或者是有什么更好的办法能实现这样的功能。

还有一点就是在接收到数据的时候,MSComm口会自动触发OnComm事件,但是当上一个OnComm事件处理结束以后,MSComm没有接到下一组数据,也就是发送端还没发送下一组数据的时候,怎么样能判断出来当前的状态,以便让循环重新运行。

由于我接触VC时间不长,还有很多不明白的东西,希望各位前辈能多多指导~~~多谢~
...全文
653 21 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhuo811 2009-09-25
  • 打赏
  • 举报
回复
我用过线程,程序比较慢,
galactic 2009-03-12
  • 打赏
  • 举报
回复
没人知道这个问题怎么解决了吗?
galactic 2009-03-11
  • 打赏
  • 举报
回复
现在我的程序是MSComm控件的OnComm事件负责接收数据,线程中调用MSComm的SetOutPut函数来发送数据,这个线程是一直不断循环的,现在的问题是OnComm接收数据部分一切正常,但是在线程中只要一涉及到MSComm控件的使用,程序就会崩溃,不知道该如何解决这个问题。
galactic 2009-03-11
  • 打赏
  • 举报
回复
要在一个线程中使用MSComm控件 必须要在OnCreate函数中创建该控件吗?还有 楼上说的OnCreate函数是不是就是窗口类的Create函数?
ggmfc 2009-03-11
  • 打赏
  • 举报
回复
up!学习了!
tonyhf 2009-03-10
  • 打赏
  • 举报
回复
代码如下

//创建控件的实例
DWORD style=WS_VISIBLE|WS_CHILD;
if (!myComm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1))
{
AfxMessageBox("创建MSComm控件失败!");
m_Opencom.EnableWindow(false); //使打开串口按钮无效
m_Closecom.EnableWindow(false); //使关闭串口按钮无效
m_Setupcom.EnableWindow(false); //使设置按钮无效
return -1;
}
m_Para="COM1,9600,N,8,1";
return 0;
tonyhf 2009-03-10
  • 打赏
  • 举报
回复
楼主检查下OnCreate函数中有没有添加MSComm控件创建的代码?如果没有就加上去,这样就可以知道是不是控件没创建成功的原因了
galactic 2009-03-10
  • 打赏
  • 举报
回复
还有一个问题 我在一个线程中用MSComm控件来发送数据 为什么一运行到comm发数据的时候 程序就崩溃呢?测试了一下 不只是用output的时候 而是一调用MSComm控件 程序就崩溃 这是为什么呢?
galactic 2009-03-05
  • 打赏
  • 举报
回复
能不能给我个创建事件(Event)和使用WaitForSingelObject的例子?
xiaokunshuai 2009-03-05
  • 打赏
  • 举报
回复
既然在处理完命令响应之后要求FOR循环重新开始,就不能为FOR循环单独开一个线程,而是因该放在一个函数中。当处理完命令响应之后,此时应该发一个消息,用FOR循环所在的函数来响应,这样循环就能重新开始了。
菜牛 2009-03-04
  • 打赏
  • 举报
回复
我说的界面响应,是指你的程序中有一个比较大的循环【for(;;)】会阻塞界面的响应。
galactic 2009-03-04
  • 打赏
  • 举报
回复
TO:Mackz
==========================================

不好意思,刚才又仔细看了你的回答,好像我自己有点理解错了,现在再试试。关于你说的创建事件和使用WaitForSingelObject的方法,有没有例子什么的,能不能给我看看,我有点不太会用,谢谢了
galactic 2009-03-04
  • 打赏
  • 举报
回复
TO:Mackz
==========================================

可是我这个还是要考虑到界面相应的 需要把OnComm接收到的数据 和 那个线程运行出来的一些数据显示在一个ListBox里面,我用你说的方法试了一下,好像OnComm事件不触发了。
你能不能指点一下我说的那个线程停止的问题 给我指点一下 谢谢了~~
ljooo 2009-03-04
  • 打赏
  • 举报
回复
用cnComm这个免费的类方便很多。
菜牛 2009-03-04
  • 打赏
  • 举报
回复
不考虑你的界面响应的话,可以不用多线程(其实串口的事件响应已经是一个线程了),创建一个事件(Event),初始化无信号(其实用串口的事件也可以),在循环中(最内层最保险,根据需要)检测这个事件(用WaitForSingelObject),事件有信号就退出循环;在OnComm事件中设置这个事件为有信号状态,OnComm事件处理函数退出前将该信号量置于无信号状态,调用循环所在的函数。
galactic 2009-03-04
  • 打赏
  • 举报
回复
出了点错误 修改一下
void CStatusCheckDlg::OnComm()
{
switch(m_mscomm.GetCommEvent())
{
case 2: // Receive Data
// 在这里停止线程

// 相关的代码处理(省略)

// 这里再重新挂起线程
break;

}
}
galactic 2009-03-04
  • 打赏
  • 举报
回复
按照上面说的方法,我写了一个线程,不是某一个类的线程,而是全局性质的

UINT ReceiveWait(LPVOID param)
{
while(1)
{
for(;;)
{
// coding here………………
}
}
}
在一个按钮事件中调用(挂起)这个线程
HWND hWnd=GetSafeHwnd();
AfxBeginThread(ReceiveWait,hWnd,0);

然后这个线程就会一直不断的运行了。现在,我想让该线程在MSComm控件的OnComm事件一被触发的时候就停止运行,OnComm事件运行结束以后,再重新给他挂起,也就是说让for(;;)重新开始循环,而不是继续循环

void CStatusCheckDlg::OnComm()
{
switch(m_mscomm.GetCommEvent())
{
case 2: // Receive Data
// 在这里停止线程
break;
// 这里再重新挂起线程
}
}
请问一下具体该怎么操作?


cuixd2020 2009-02-26
  • 打赏
  • 举报
回复
接分
zhstars 2009-02-26
  • 打赏
  • 举报
回复
这个是可以的,不过你要看清前提,for(;;)是要开一个线程来执行的!
galactic 2009-02-26
  • 打赏
  • 举报
回复

To:oyljerry
===================

包含for(;;)的线程可以和MSComm的OnComm事件同时进行 是吗?也就是循环的同时也可以接收数据 是这样吗?

加载更多回复(1)

16,548

社区成员

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

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

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