怪问题,请教高人!!!

wxf54318 2009-07-29 03:34:01
我是在定时时间到发送消息的
我现在知道GetParent()->m_hWnd得到的是CMAINFRAME窗口的句柄,我在CMAINFRAME中又建立了消息映射把消息转发到了CVIEW窗口了,
但是新问题出现了
CVIEW类可以响应对话框消息了,但是我在CVIEW类的消息响应函数或是函数建立的线程好像不受对话框类设置的定时器控制,执行了多次,这又是什么原因呢。
...全文
195 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
wxf54318 2009-08-05
  • 打赏
  • 举报
回复
我犯了个低级错误,我用代表的时间间隔的变量为int 型,从1-180,我用 settimer设置时应该*1000才对,settimer是以毫秒定时的,我设置了一个定时器用settimer(1,1000,null),但是设置这个定时器时我忘了,真是不好意思麻烦大家
wxf54318 2009-08-03
  • 打赏
  • 举报
回复
楼上,我是看孙鑫的VC++深入详解中的多线程一章这么做的,上面说,实际上调用CloseHandle函数并没有中执行创建的线程,知识表示在主线程中对新创建的线程的引用不感兴趣。
zhouzhipen 2009-08-03
  • 打赏
  • 举报
回复
LRESULT CDataDisplayView::OnSaveTxt(LPARAM lParam,WPARAM wParam)
{
HANDLE hThread2=CreateThread(NULL,0,
(LPTHREAD_START_ROUTINE)threadSaveTxt,NULL,0,NULL); //创建将数据保存为txt的线程
CloseHandle(hThread2);
return 0;
}


这样也行???
线程在执行时,你确把句柄关闭掉,不死才有问题呢!
CloseHandle(hThread2);//这一句会把你的主线程挂起
wxf54318 2009-08-03
  • 打赏
  • 举报
回复
我是想定时把数据保存到文件
snritxihc 2009-08-03
  • 打赏
  • 举报
回复
怎么有文档视图又有对话框
各个部分之间的关系怎么样的?
请描述清楚一些。

*****************************************************************************
欢迎使用CSDN论坛专用阅读器 : CSDN Reader(附全部源代码)

http://feiyun0112.cnblogs.com/
wxf54318 2009-08-03
  • 打赏
  • 举报
回复
不知道什么原因啊,头大了
副组长 2009-08-02
  • 打赏
  • 举报
回复
因为你是在OnTimer里面不停地发送消息,发送一次消息就启动一次线程。
程序看起来象死了一样可能是因为一个线程还没出来,另一个又开始了,造成了阻塞。

不要这么搞,如果你一秒一个计时,频繁file.Open(sFileName.GetBuffer(0),CFile::modeCreate|//一分钟同样的文件创建60次?

说说你到底想干什么吧。
wxf54318 2009-08-02
  • 打赏
  • 举报
回复
ontimer应该在哪个类定义呢,对话框,CMAINFRAME 还是VIEW
wxf54318 2009-08-01
  • 打赏
  • 举报
回复
就是想不明白到底怎么回事,ONTIMER函数在VIEW类和自定义的弹出式对话框类中怎么就不行呢
wxf54318 2009-07-31
  • 打赏
  • 举报
回复
把另一个消息从定义一个。不要用一样的。
我这样做了,还是线程调用了多次
rendao0563 2009-07-31
  • 打赏
  • 举报
回复
把另一个消息从定义一个。不要用一样的。
wxf54318 2009-07-30
  • 打赏
  • 举报
回复
CMAINFRAME 和 VIEW类,我的消息响应函数名字和参数是一样的
Fireway2008 2009-07-30
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wxf54318 的回复:]
两个类中使用了同样的消息处理函数,这样用可以吗
[/Quote]

哪2个类?
重载形式和内容最好都不一样。
wxf54318 2009-07-30
  • 打赏
  • 举报
回复
两个类中使用了同样的消息处理函数,这样用可以吗
Fireway2008 2009-07-30
  • 打赏
  • 举报
回复
C**view响应消息
LRESULT CDataDisplayView::OnSaveTxt(LPARAM lParam,WPARAM wParam)
{
HANDLE hThread2=CreateThread(NULL,0,
(LPTHREAD_START_ROUTINE)threadSaveTxt,NULL,0,NULL); //创建将数据保存为txt的线程
CloseHandle(hThread2);
//应该用PostThreadMessage退出这个线程
return 0;
}

另外,把这个触发消息放入一个按钮试试看是否会出现类似情况,设置断点看看哪里导致了消息不断地发送。
wxf54318 2009-07-30
  • 打赏
  • 举报
回复
我试一试
gg606 2009-07-30
  • 打赏
  • 举报
回复
1、对话框是不是有多个定时器?
2、所谓执行多次是几次?
你在
void CSaveIntervalDlg::OnTimer(UINT nIDEvent)
{
::PostMessage(GetParent()->m_hWnd,WM_SAVETXT,0,0);
//这里加一句,只触发一次定时事件
KillTimer(nIDEvent);
CDialog::OnTimer(nIDEvent);
}

看看到底执行了几次。

3、做这么点小事,觉得没必要使用线程。

4、“CMAINFRAME 和 VIEW类,我的消息响应函数名字和参数是一样的”

我觉得关键是消息是一样的,函数都是映射到那个你的自定义消息上的!
主线程的消息循环只有一个,这个消息可以由窗口类处理,
也可以由视图类或文档类处理,你这样都添加处理函数,就产生了两次调用。

直接在视图类里处理就可以。
wxf54318 2009-07-29
  • 打赏
  • 举报
回复
线程函数执行了多次,程序好像要死掉一样,请高人指导下,是不是不可以通过CMAINFRAME传递消息呢
wxf54318 2009-07-29
  • 打赏
  • 举报
回复
发送消息到CMAINFRAME
void CSaveIntervalDlg::OnTimer(UINT nIDEvent)
{
::PostMessage(GetParent()->m_hWnd,WM_SAVETXT,0,0);
CDialog::OnTimer(nIDEvent);
}
/////////////////////////////
CMAINFRAME接收后到消息转发给C**view
LRESULT CMainFrame::OnSaveTxt(LPARAM lParam,WPARAM wParam)
{
::PostMessage(this->GetActiveView()->m_hWnd,WM_SAVETXT,0,0);
return 0;

}
/////////////////////////////////
C**view响应消息
LRESULT CDataDisplayView::OnSaveTxt(LPARAM lParam,WPARAM wParam)
{
HANDLE hThread2=CreateThread(NULL,0,
(LPTHREAD_START_ROUTINE)threadSaveTxt,NULL,0,NULL); //创建将数据保存为txt的线程
CloseHandle(hThread2);
return 0;
}
/////
在C**VIEW.cpp中创建一个线程处理数据
//将数据保存成txt线程
DWORD threadSaveTxt(LPVOID pParam)
{

char buf[40];
CString sFileName;
CFrameWnd *pWnd = (CFrameWnd *)AfxGetMainWnd();
CDataDisplayView *pView = (CDataDisplayView *)pWnd->GetActiveView();
CStdioFile file;
sFileName.Format("%d-%d-%d.txt", pView->systime.wYear,
pView->systime.wMonth,pView->systime.wDay);
file.Open(sFileName.GetBuffer(0),CFile::modeCreate|//以读写方式打开文本文件,如果文件已存在,不清空文件
CFile::modeNoTruncate|
CFile::modeReadWrite|CFile::typeText);
sprintf(buf, "%6.2f %6.2f %6.2f %6.2f %d:%d:%d\r\n",
pView->pDlg2->m_dMv,
pView->pDlg2->m_dPh,
pView->pDlg2->m_dConc,
pView->pDlg2->m_dTm,
pView->systime.wHour,
pView->systime.wMinute,
pView->systime.wSecond);
file.Seek(0,CFile::end); //将文件指针移动到文件末尾,否则
file.WriteString(buf);
return 0;
}
Fireway2008 2009-07-29
  • 打赏
  • 举报
回复
怎么有文档视图又有对话框
各个部分之间的关系怎么样的?
请描述清楚一些。

线程之间的通讯必须通过消息实现,请把有问题的执行代码贴出来看看 。
加载更多回复(1)

16,473

社区成员

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

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

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