如何让程序暂停和重新开始

tbandit 2006-06-02 10:05:36
想实现的功能是:当鼠标点击时,开始向串口写数据,鼠标第二次点击时暂停写数据,再次点击时接着向串口写数据,一次类推。写入串口的数据是通过一个do循环获得的,也就是说如何能够暂停和继续这个do循环?或者其他可行的办法解决这个问题都可以。
...全文
615 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
tbandit 2006-06-20
  • 打赏
  • 举报
回复
谢谢各位!
zjf0000 2006-06-08
  • 打赏
  • 举报
回复
好像SetTime()函数的第一个参数不应该是NULL,那样的话响应函数应该是OnTimer()
youngwolf 2006-06-08
  • 打赏
  • 举报
回复
交换两函数的先后顺序。
tbandit 2006-06-08
  • 打赏
  • 举报
回复
谢谢各位,用的是多线程的方法。但是在多线程里面用计时器又碰到新的问题。代码如下
UINT TimerProc(LPVOID pParam)//TimerProc函数是线程函数
{
SetTimer(NULL,1,1000,TimerProc);
}
//Timeproc函数
void CALLBACK TimerProc(HWND hwnd,UINT uMsg,UINT_PTR idEvent,DWORD dwTime)
{
//code
}

编译时提示“TimerProc":undeclared identifier.可是我定义了也不管用,这是怎么回事



eein 2006-06-04
  • 打赏
  • 举报
回复
假如是在FOCUS窗口下执行,则可以编写
窗体的两个事件 鼠标双击事件处理,和单击事件处理.就可以了.

如果不是的话,可以采用HOOK技术,来处理 鼠标双击事件,和单击事件
tbandit 2006-06-04
  • 打赏
  • 举报
回复
SeRapHiw(灯芯草) 的办法不错,不过我还想让程序随时停止和继续,可能还是多线程比较好控制。
SeRapHiw 2006-06-04
  • 打赏
  • 举报
回复
再说一句“所以在这种情况下用mouse事件改变输出标志不能使串口输出停止。”

事实是只要while{}没有执行完,mouse点击改变不了bFlag这个输出标志。
就造成死循环了
SeRapHiw 2006-06-04
  • 打赏
  • 举报
回复
用单线程应该也可以,
问题在于你的串口发送放在while循环中得有必要吗?
while循环执行的相当快,而串口发送速度都比较慢的,
推荐用Timer来发送串口数据。

这在一个函数中使用while{}的时候,
当程序调用了这个函数,
这个while循环在执行完前是跳不出来的,
除非遇到了更高级的中断,
而在windoz中,mouse、键盘输入的中断级都比较低的,
所以在这种情况下用mouse事件改变输出标志不能使串口输出停止。

如果设置一个timer,在OnTimer里进行数据的发送,再配合mouse的事件就不会出现标志位检测不到的现象了。

当然,用多线程也可以。
ks_gq 2006-06-02
  • 打赏
  • 举报
回复
写数据由一个单独的线程来完成, 适当的将此线程挂起(SuspendThread), 和恢复(ResumeThread)
就可以了。
youngwolf 2006-06-02
  • 打赏
  • 举报
回复
专业点的话可以用事件,粗糙点的话,如下:
假设bSend为一全局变量,或一类变量,总之在处理鼠标点击程序段和do循环程序段都能访问到就行了。

BOOL bSend = TRUE;

do
{
if (bSend)
Send();
}while(...);

下面是鼠标处理函数:
void fun(...)
{
bSend = !bSend;
}

上面的方法几乎占用额外的资源,而且也能达到要求,非常直得推荐。
曾经的猎狐 2006-06-02
  • 打赏
  • 举报
回复
BOOL bFlag = TRUE;

while(1)
{
if(bFlag)
Write.....
}

OnMouseDown
{
bFlag = !bFlag;
}
gudulyn 2006-06-02
  • 打赏
  • 举报
回复
while(1)
{
if(expressoion)
//写串口
}
在鼠标按下事件中处理expression就行了。

无知者无谓 2006-06-02
  • 打赏
  • 举报
回复
一个循环是不够的
最好是记录你写的offset,响应鼠标点击事件,写或者停,写的时候从上次的offset开始写
hamimelon 2006-06-02
  • 打赏
  • 举报
回复
把要写入串口的数据放到一个队列里面,
外面控制队列的操作就行了!
youngwolf 2006-06-02
  • 打赏
  • 举报
回复
这个问题只有用多线程最好,我想楼上各位应该都是默认使用多线程的,所以我没有点明。
do
{
if (bSend)
Send();
}while(...);
应该放在一个工作线程中。
mynamelj 2006-06-02
  • 打赏
  • 举报
回复
WaitForSingleObject
tbandit 2006-06-02
  • 打赏
  • 举报
回复
gudulyn(冰楠) 和yang79tao() 的方法试了,没有作用,主要是循环没有结束的时候根本不响应鼠标事件,大概是单线程的原因。不知道是不是?

16,466

社区成员

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

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

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