我寫了一個Class部份內容如下:
class CMainWnd:public CFrameWnd
{
public:
CMainWnd();
virtual ~CMainWnd();

virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
public:
CToolBar m_wndToolBar;
CStatusBar m_wndStatusBar;
CTreeView m_wndTreeView;
CStatic m_wndStatic; static CALLBACK BOOL SetStatusBarDateTime();  //我想將此Function作為CreateThread的CallBack函數;
//...
};//然后在OnCreate后,加了一個執行緒,讓它專門顯時日期和時間;
CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(this->SetStatusBarDateTime),NULL,0,NULL);BOOL CALLBACK  CMainWnd::SetStatusBarDateTime()
{
char szDate[10],szTime[10];
SYSTEMTIME uSysDateTime;
::GetLocalTime(&uSysDateTime);

sprintf(szDate,"%d/%d/%d",uSysDateTime.wYear,uSysDateTime.wMonth,uSysDateTime.wDay);
sprintf(szTime,"%d:%d:%d",uSysDateTime.wHour,uSysDateTime.wMinute,uSysDateTime.wSecond);
//因為這個成員Function是static的,所以沒this指針,我只有強行轉換m_pMainWnd指針);
CMainWnd *pMainWnd=static_cast<CMainWnd *> (AfxGetApp()->m_pMainWnd);
pMainWnd->m_wndStatusBar.SetPaneText(4,szDate); //運行到這里就出錯;
pMainWnd->m_wndStatusBar.SetPaneText(5,szTime);
return TRUE;
}以上編譯均正確,並pMainWnd指針都沒問題.
但運行到:
pMainWnd->m_wndStatusBar.SetPaneText(4,szDate);
pMainWnd->m_wndStatusBar.SetPaneText(5,szTime);
就出錯了..如果不創建線程.在MENU OR BUTTON 的Click過程中再調用SetStatusBarDateTime()卻沒問題?
如:void CMainWnd::OnTest1()
{
this->SetStatusBarDateTime(); //這樣調用就沒問題.
}請問各位大俠是什麼原因?

解决方案 »

  1.   

    你的线程是不是开的太早? 在statusbar还没有创建出来就调用他的方法了?
      

  2.   

    同意
     beijingshizi(北京石子)(★★★★★)
      

  3.   

    CMainWnd *pMainWnd=static_cast<CMainWnd *> (AfxGetApp()->m_pMainWnd);//static_cast  一点道理都没有, 用错啦.
    static_cast 及 dynamic_cast 是要将派生类转化为基类, 和static 型变量没有关系!去掉
    static_cast
    也可吧
      

  4.   

    你的线程函数类型正确吗????UINT ThreadFunc(void*);//这是正确的原形
      

  5.   

    RE:ghxmagic(ghxmagic):
    CMainWnd *pMainWnd=static_cast<CMainWnd *> (AfxGetApp()->m_pMainWnd);

    CMainWnd *pMainWnd=(CMainWnd*)(AfxGetApp()->m_pMainWnd);
    都一樣,這個是強行把派生类转化为基类的.
      

  6.   

    static CALLBACK BOOL SetStatusBarDateTime(); //CALLBACK 没有必要,另外看一下线程的那个函数需不需static, 
    但应该加上WINAPI如: BOOL WINAPI SetStatusBarDateTime();