如题:基于对话框的程序,主进程创建一个线程后,在线程执行的过程中,需要修改对话框上面的CEdit控件的显示内容,怎样实现???
有人说在线程中发消息给窗口,可是怎样发呀,我是菜鸟,谁有这方面的示例给我看一下!!!!!
有人说在线程中发消息给窗口,可是怎样发呀,我是菜鸟,谁有这方面的示例给我看一下!!!!!
解决方案 »
- vc++调试运行常识问题
- 关于程序自启动的路径问题
- 请VC++ 熟悉MFC模式的 高 手大 侠们 帮忙急急急急急急急!!!!!!!
- 请教,关于list中erase的问题。
- CSockect类的Send(....)函数调用的哪个DLL的发送数据的?XP版本和WIN2K的DLL不同吗?解决马上解贴。
- 怎样写倾斜文本?
- 如何保存csdn上的页面???
- 送分100分:打开DSP文件和打开DSW文件有什么区别,是不是打开DSP文件前必须先打开DSW文件.
- 各位高手如何控制电影碟或者卡拉OK碟的左右声道?
- QOS(服务质量)常用到的吗?还是几乎没什么用?
- 1个dll,用depend看只有一个启动和结束函数,请教通常做法会把数据写到哪里
- 如何实现窗口内容放大
{CDataTransferDlg * m_pDlg = (CDataTransferDlg *) pDlg;CByteArray YCDarraySend;
CString YCStrTemp,YCStrSend;
DataRelay ThreadDataRelayObj;ThreadDataRelayObj.YCPackNum=0;
ThreadDataRelayObj.AnalogInfoRelay(); HWND hh;
hh=GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_EDIT_List);//这里出错,报异常
SetWindowText(hh,"");
hh=GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_EDIT_List);
SetWindowText(hh,m_pDlg->DataRelayObj.Str_data);
hh=GetDlgItem(AfxGetMainWnd()->m_hWnd,IDC_STATIC_YCDX);
SetWindowText(hh,m_pDlg->DataRelayObj.Str_YCDXCount); if (ThreadDataRelayObj.YCPackNum==0)
return;//对象数为零则返回
unsigned char ycdata[64];
int Current;
Current=0;
for (int i=0;i<ThreadDataRelayObj.YCPackNum;i++)
{
if (ThreadDataRelayObj.YCdata[Current]=='!')
{
memset(ycdata,0,64);
for (int j=0;j<64;j++)//单帧
{
ycdata[j]=ThreadDataRelayObj.YCdata[Current+j];
YCStrTemp.Format("%d ",ThreadDataRelayObj.YCdata[Current+j]);
YCStrSend+=YCStrTemp;
}
ThreadDataRelayObj.SendDataToComm(ycdata,64);
YCStrSend+="\r\n\r\n";
Write_Log("YCSendLog",YCStrSend);//这里报异常提示要中断程序
YCStrSend.Empty();
YCStrTemp.Empty();
Current+=64;
}Sleep(47);}}
void CDataTransferDlg::OnTimer(UINT nIDEvent)
{
switch(nIDEvent)
{
case ID_TIMER1: //每15s
hThreadYC=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)YCThreadFunc,NULL,0,NULL);break;}
CDialog::OnTimer(nIDEvent);
}
void Write_Log(CString LogName , CString LogStr)
{
SYSTEMTIME sysname;
GetLocalTime( &sysname );
CString LogTxt;
LogTxt.Format("%4d_%02d_%02d",sysname.wYear,sysname.wMonth,sysname.wDay);
LogTxt+=".txt";
CString Log_Name;
Log_Name=LogName;
Log_Name+=LogTxt;//得到日志文件名SYSTEMTIME sys;
GetLocalTime( &sys );
CString LogTime;
LogTime.Format("%4d/%02d/%02d %02d:%02d:%02d.%03d 星期%1d\r\n",sys.wYear,sys.wMonth,sys.wDay,sys.wHour,sys.wMinute,sys.wSecond,sys.wMilliseconds,sys.wDayOfWeek);
CFile filelog;
filelog.Open(Log_Name, CFile::modeReadWrite|CFile::modeCreate|CFile::modeNoTruncate,0);
filelog.SeekToEnd();
filelog.Write(LogTime,LogTime.GetLength());
filelog.Write(LogStr,LogStr.GetLength());
filelog.Flush();
filelog.Close();
}
=============
你的代码好像是将对话框指针传进了线程函数中去了,但是你后面又没有用到这个指针,直接改成m_pDlg->SetDlgItemText(....)不是更好。
另外,传送对话框指针给线程函数的做法应该是不安全的,建议用FindWindow去找主窗口,通过API进行处理。
#define WM_MYMESSAGE (WM_USER+100)
在处理消息的类类中加入
afx_msg LRESULT OnMyMessage(WPARAM wParam,LPARAM lParam);
添加消息处理宏BEGIN_MESSAGE_MAP(CMFcTestDlg, CDialog)
ON_MESSAGE(WM_MYMESSAGE, OnMyMessage)
END_MESSAGE_MAP()消息处理函数
LRESULT CMFcTestDlg::OnMyMessage(WPARAM wParam,LPARAM lParam)
{
m_edit.SetWindowText(reinterpret_cast<LPCTSTR>(lParam));
return 0;
}线程
DWORD WINAPI MyThread( LPVOID lpParam )
{
HWND h = (HWND)lpParam;
::PostMessage(h, WM_MYMESSAGE, NULL, LONG(_T("Test")));
return 0;
}void CMFcTestDlg::OnBnClickedButton2()
{
DWORD ThreadId;
::CloseHandle(::CreateThread(NULL, 0, &MyThread, LPVOID(GetSafeHwnd()), 0, &ThreadId));
// TODO: 在此添加控件通知处理程序代码
}
除了这个,我通常还会做一个全局指针指向m_pMainWnd 传递消息..
不知道这样感觉哪个好
sendmessage会等消息 处理 完生才返回
postmessage只管发,不管是否处理都直接返回