Поток WxWidgets случайно падает во время работы - PullRequest
0 голосов
/ 01 апреля 2011

Я пишу многопоточное приложение wxwidget.Но код вылетает случайным образом, о котором я понятия не имею.Я разместил свой код здесь.Эта программа создает поток при каждом нажатии кнопки.И эта тема предназначена для записи чего-либо в родительской текстовой области.Когда я запускаю код, печатается только сообщение деструктора, т.е. раздел ввода не выполняется.Я долго боролся с этой проблемой.Любая помощь будет принята с благодарностью.

Заранее благодарю ..

   void threadFrame::addthread(wxCommandEvent &event)
{
    mythread *th = new mythread(this);
    th->Create();
    th->Run();
}
mythread::mythread(GUIFrame *frame) : wxThread(wxTHREAD_DETACHED)
{
    m_frame = frame;
}
;
mythread::~mythread()
{
    WriteText(wxT("destructor"));
}
void mythread::WriteText(const wxString& text)
{
    m_frame->m_textCtrl1->SetValue(text);
}

void *mythread::Entry()
{
    WriteText(wxT("thread started"));
    return NULL;
}

Ответы [ 2 ]

2 голосов
/ 01 апреля 2011

Вы не должны использовать какие-либо GUI-подпрограммы из потоков, отличных от основного потока.Это означает, что вы должны заменить вызов ->SetValue(..) каким-либо другим механизмом (например, уведомить основной поток через событие).Я никогда не пытался это сделать, поэтому я не знаю, может ли это вызвать сбой потока.

Вы вызываете какие-либо функции, которые не подходят для отдельных потоков?

0 голосов
/ 28 апреля 2011

Вы можете получить доступ к GUI из других потоков при условии, что вы используете функции Mutex: wxMutexGuiEnter () и wxMutexGuiLeave ().

Вы уверены, что GUIFrame и threadFrame могут неявно приводиться к каждому из них? Вы называете мифред (threadFrame); Вы уверены, что ваша функция Entry () объявлена ​​в вашем классе легенд? Наконец, я объявляю функцию entry () следующим за моим файлом ".h": virtual void * Entry ();

...