wxWidgets - wxThread - PullRequest
       5

wxWidgets - wxThread

0 голосов
/ 13 февраля 2011

Я разрабатываю приложение, которое должно иметь постоянное прослушивание сокета сервера, поэтому я поместил его в поток, здесь есть класс, который я написал для него:

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 обработчик Thread:

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

Теперь проблема в том, что когда клиент подключается к моему Приложению, поток прослушивания получает это входящее соединение (для каждого соединения, безусловно, он использует другой SocketBase из массива sockConvs) и выделяет (как вы можете видеть) новый MyFrame , НО! в конце метода Entry мой новый фрейм закрывается. Почему?

Спасибо!

1 Ответ

1 голос
/ 13 февраля 2011

Я подозреваю, что это может быть связано с тем, что вы не должны делать какие-либо вызовы GUI во вторичных потоках, это более подробно объясняется в документации wxThread .Вы, вероятно, должны опубликовать событие обратно в свой главный поток и создать там фрейм.

...