2011-02-13 50 views
0

我開發一個需要有一個永久的服務器監聽套接字的應用程序,所以我把它在一個線程,這裏有我爲它編寫的類:wxWidgets的 - wxThread

class listenThread : public wxThread 
{ 
    public: 
     listenThread(MyFrame *h) : wxThread() { handler = h; }; 
     virtual void * Entry(); 
    private: 
     MyFrame *handler; 
}; 

void *listenThread::Entry() 
{ 
    handler->sockConvs[nconvs] = handler->sockServer->Accept(); 

    if(handler->sockConvs[handler->nconvs]->IsConnected() && handler->nconvs < 10) 
    { 
    handler->frames[handler->nconvs] = new MyFrame(NULL); 
    handler->frames[handler->nconvs++]->Show(); 
    } 
} 

的主題類MyFrame處理程序:

class MyFrame : public wxFrame 
{ 
    friend class listenThread; 

    public: 

      /* other stuff ... */ 

    private: 
      /* other stuff ... */ 

    private: 
     listenThread *myThread; 

     // Both initialized in MyFrame class constructor 
     wxSocketServer *sockServer; 
     wxIPV4address addr; 

     wxSocketBase *sockConvs[10]; 
     MyFrame *frames[10]; 
     int nconvs; 
}; 

現在的問題是,當一個客戶端連接到我的應用程序,監聽線程接收到達的連接(每個連接,obiviusly,它使用從sockConvs陣列不同SocketBase)和分配(如你所見)一個新的MyFrame。 但是!在Entry方法結束時,我的新Frame被關閉。爲什麼?

謝謝!

回答

1

我懷疑這可能與您不應該在輔助線程中進行任何GUI調用有關,這在wxThread的文檔中有更詳細的解釋。您可能應該將事件發回您的主線程並在那裏創建框架。