如何用UI 线程处理每5秒更新文本的问题?

cayido 2007-07-16 10:14:22
我现在有一对话框,每5秒需要更新次,更新方法已写好,需要开创个线程来控制更新。

但是MFC的线程还是一头雾水,求教.
以下是我的思路

//按钮开创线程,给线程发送消息
void CMFC_TestForeignDlg::OnBnClickedThread()
{

m_pThread = (CMyUIThread*)AfxBeginThread(RUNTIME_CLASS(CMyUIThread));
m_pThread->PostThreadMessage(UM_UPDATE,0,0);
}

//然后线程处理消息
BEGIN_MESSAGE_MAP(CMyUIThread, CWinThread)
ON_THREAD_MESSAGE(UM_UPDATE, UpdateDlg)
END_MESSAGE_MAP()

请问这个UpdateDlg方法该怎么写,在我的DIALOG类里的消息循环我也定义了一个自定义消息
ON_MESSAGE(WM_USER_MESSAGE,UpdateItem)
UPDATEITEM就是真正的更新方法,求教如何在线程设置时间,每隔5秒发送次WM_USER_MESSAGE消息.
...全文
319 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cayido 2007-07-16
  • 打赏
  • 举报
回复
谢谢了 大家好热情,不过我要具体研究UI线程的使用方法
cayido 2007-07-16
  • 打赏
  • 举报
回复
還有個問題 就是ON_THREAD_MESSAGE(UM_UPDATE,UpdateDlg)
这样写有错 是什么原因?
具体错误是
Error 1 error C2440: 'static_cast' : cannot convert from 'void (__thiscall CMyUIThread::* )(void)' to 'void (__thiscall CWinThread::* )(WPARAM,LPARAM)' d:\working\mfc_testforeign\mfc_testforeign\myuithread.cpp 34

UM_UPDATE是我DLG里发过来的自定义消息
dzq138 2007-07-16
  • 打赏
  • 举报
回复
.H 文件:

static DWORD WINAPI AccountThreadProc(LPVOID lpParameter); //必须声明为静态的线程函数.当然如果是全局的则没这个必要
bool CreateAccountThreadProc(void);//建立计算线程
bool DestroyAccount(void); //强制结束线程函数
HANDLE m_hAccountThread; //用于存放
DWORD m_dwAccountThreadId;


.cpp

bool CXXXDlg::CreateAccountThreadProc(void) //CXXXDlg 为你的窗体类
{//建立计算线程
m_hAccountThread=CreateThread(0,0,CXXXDlg::AccountThreadProc,(LPVOID)this ,0,&m_dwAccountThreadId);//工作线程开始工作
if(!m_hAccountThread)
return FALSE; //不成功
else
return TRUE; //成功
}
DWORD WINAPI CzbhxDlg::AccountThreadProc(LPVOID lpParameter)
{ //计算工作线程

CXXXDlg* pCXXXDlg=(CXXXDlg*)lpParameter;
//这就是你要工作的地方.
//pCXXXDlg作表CXXXDlg窗体指针.要访问到窗体变量或什么的请用 pCXXXDlg->
}

bool CXXXDlg::DestroyAccount(void)//强制结束线程函数
{
if(m_hAccountThread)
{
BOOL b=FALSE;
DWORD ExitCode;
int Timeout = 50;
while(Timeout)//等待线程结束,如果到一定时间内没结束,就强制结束
{
GetExitCodeThread(m_hAccountThread, &ExitCode);

if (ExitCode != STILL_ACTIVE)
{
b=TRUE;
// Thread has ended.
break;
}
else
{
Sleep(10);
}

--Timeout;
}
if(!b)//time out ,terminate it
TerminateThread(m_hAccountThread,0);

}
m_hAccountThread=NULL;
return TRUE;
}

bool boc=CreateAccountThreadProc(); //调用线程开始工作

tanyaliji 2007-07-16
  • 打赏
  • 举报
回复
加一定时器,执行ontimer()
或另开一个线程进行定时工作。
simon031187 2007-07-16
  • 打赏
  • 举报
回复
如果是基于CWinThread的,在线程里开定时器不就行了,
SetTimer
KillTimer
ON_THREAD_MESSAGE(WM_TIMER, OnTimer)

15,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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